python管理mysql(实现读写分离)及如何用Mycat读写分离

news2024/11/14 16:35:13

Day24  

编写python代码实现读写分离

1、安装pymysql,它是python管理mysql的驱动,或者称为连接器

[root@pyhton ~]#pip3 config set global.index-url Simple Index

[root@python ~]# pip3 install pymysql   #安装pymysql

[root@pyhton ~]# python3

Python 3.6.8

[root@pyhton ~]# yum -y install pymysql

2、编写rwsplit.py文件

# 引入模块 python链接mysql工具,驱动包,连接器

import pymysql

# python 类 类名 rwsplit,名字可以和文件名不一致

# 三个函数,函数的标识 def 函数名 (self,参数列表):

# __init__ 初始化函数,构造函数,在这个类被实例的时候,执行__init__函数

# master_statment 自定义函数,根据实际需要,开发或者运维自己定义的函数

# slave_statement 自定义函数,根据实际需要,自定

class rwsplit(object):

# 构造函数

# 1.在屏幕上输出了 initialized

# 2.创建了全局变量master_conn

# 3.创建了全局变量slave_conn

# 4.全局变量可以在其他的函数中进行调用和修改

# 5.为什么要在init函数中创建全局变量,因为init在rwsplit类被实例的同时执行

def __init__ (self):

print("initialized")

self.master_conn=pymysql.connect(

host="10.1.1.11",

user="zhangmin",

password="zhangmin",

database="test",

port=3306

)

self.slave_conn=pymysql.connect(

host="10.1.1.12",

user="zhangmin",

password="zhangmin",

database="test",

port=3310

)

# 输出serverid,执行sql语句,增删改查

def master_statment(self,sql):

cursor=self.master_conn.cursor()

cursor.execute("show variables like 'server_id'")

print(cursor.fetchall())

print(cursor.execute(sql))

self.master_conn.commit()

# 执行查询操作

def slave_statment(self,sql):

cursor=self.slave_conn.cursor()

cursor.execute(sql)

print(cursor.fetchall())

# 入口

if __name__ == "__main__":

# 实例rwsplit

demo=rwsplit()

# 要求用户输入一个sql语句

sql=input("sign sql:")

#判断sql

if sql[:6]=="select" or sql[:4]=="show":

demo.slave_statment(sql)

else:

demo.master_statment(sql)

从服务器登录mysql 8.x遇到的问题(每次要获取公钥)之解决方案

[root@salve_mysql ~]# help change master

# Get_master_public_key: 1/0   【自动获取/不自动获取】

[root@salve_mysql ~]#mysql -uroot -p

Enter password:Juan@1888$

mysql> show slave status\G

# 先停用slave服务

[root@salve_mysql ~]#stop slave;

# 重写change_master,解决每次登录从服务器都需要公钥的问题:

mysql>change master to

master_host="192.168.2.206",

master_user='slave0',

master_password='slave0',

master_port=3306,

master_laster_log_file='binlog.000001',

master_log_pos=748;

# 然后启动slave并查看状态

mysql>start slave;

mysql>show slave status\G

mysql -uslave -p123 -h10.0.0.13 -P3306 --get-server-public-key         

//获取服务器的公共密钥

python管理mysql(192.168.2.206)

# mysql5.7的安装和配置,此版本没有公钥

1、下载并压缩软件包

[root@mysql5 ~]# ls

anaconda-ks.cfg

initserver.sh

mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

soft

[root@mysql5 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

2、移动目录

[root@mysql5 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql

3、清空/etc目录下的my.cnf

[root@mysql5 ~]#  rm -rf /etc/my.cnf

3、创建用户和文件并修改文件的所属组

[root@mysql5 ~]# mkdir /usr/local/mysql/mysql-files

[root@mysql5 ~]# useradd -r -s /sbin/nologin mysql

[root@mysql5 ~]# chown mysql:mysql /usr/local/mysql/mysql-files/

[root@mysql5 ~]# chmod 750 /usr/local/mysql/mysql-files/

4、初始化数据库,找到初始密码 

[root@mysql5 ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql

A temporary password is generated for root@localhost: uK%b!EI&I9rf

5、查看是否生成data目录

[root@mysql5 ~]#  ls /usr/local/mysql/

bin   include  man          share

data  lib      mysql-files  support-files

docs  LICENSE  README

6、把mysql.server文件放到/etc/init.d/目录下

[root@mysql5 ~]#  cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql57

[root@mysql5 ~]# service mysql57 start

Starting MySQL.Logging to '/usr/local/mysql/data/mysql5.7.err'.

SUCCESS!

7、编写配置文件

[root@mysql5 ~]# vim /usr/local/mysql/my.cnf

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

port=3306

log-error=/usr/local/mysql/data/db01-master.err

log-bin=/usr/local/mysql/data/binlog

server-id=10

character_set_server=utf8mb4

[root@mysql5 ~]# service mysql8 start

8、首次登录并设置创建可远程的连接用户huajuan

[root@mysql5 ~]# /usr/local/mysql/bin/mysql -p

Enter password:

mysql> alter user 'root'@'localhost' identified by 'root';

Query OK, 0 rows affected (0.00 sec)

mysql>  create user 'huajuan'@'%' identified by 'huajuan';

Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to 'huajuan'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql>  flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> create database if not exists test charset utf8mb4;

Query OK, 1 row affected (0.00 sec)

mysql> use test;

Database changed

mysql> create table user(

    -> id int primary key auto_increment,

    -> username varchar(45) not null,

    -> password varchar(45) not null

    -> );

Query OK, 0 rows affected (0.01 sec)

mysql> insert into user (username, password) values('aaa', 'aaa');

Query OK, 1 row affected (0.00 sec)

mysql> select * from user;

+----+----------+----------+

| id | username | password |

+----+----------+----------+

|  1 | aaa      | aaa    |

+----+----------+----------+

1 row in set (0.00 sec)

mysql> select host,user from myqsl.user;

mysql> update mysql.user set host='%' where user='root';

mysql> flush privileges;

#插入记录,发现此时卡住,取消锁表才可执行成功

mysql> insert into user (username, password) values('bbb', 'bbbb');

# python3管理mysql的具体配置

[root@pyhton ~]# yum -y install pymysql

[root@pyhton ~]# python3

# 编写.test.py文件实现

import pymysql

conn=pymysql.connect(host='192.168.2.220',port=3306,database='test',user='root', password='root' )

cursor=conn.cursor()

# 创建用户slave0,此时root拒绝远程登录

cursor.execute("create user 'slave0'@'%'%' identified by 'slave0'")

cursor.execute('grant replication slave on *.* to "slave"')

# 这次允许root远程,可以添加权限

conn=pymysql.connect(host='', port=0)

cursor.execute("grant replication slave on *.* to 'slave0'@'%'")

# 刷新权限并锁表

cursor.execute("flush privileges")

cursor.execute("flush tables with read lock")

#获得master的状态

cursor.execute("show master status")

print(cursor.fetchall())

(('binlog.000001'))

# 等待slave就绪后解锁,此时才可插入记录

isOk=input("slave server ok? y/n")

if isOK=='y':

cursor.execute("unlock tables")

同步数据,将master的data文件传给slave

[root@mysql5 ~]# scp -r /usr/local/mysql/data root@192.168.2.222:/usr/local/mysql/

[root@slave57 ~]# ls /usr/local/mysql/

bin   docs     lib      man     mysql-files  share

data  include  LICENSE  my.cnf  README       support-files

[root@slave57 ~]# ls /usr/local/mysql/data/

auto.cnf       ca.pem           ib_logfile0         public_key.pem

binlog.000001  client-cert.pem  ib_logfile1         server-cert.pem

binlog.000002  client-key.pem   mysql               server-key.pem

binlog.000003  db01-master.err  mysql5.7.err        sys

binlog.index   ib_buffer_pool   performance_schema  test

ca-key.pem     ibdata1          private_key.pem

[root@mysql5 ~]# service mysql57 start

Starting MySQL. SUCCESS

# 检查是否同步

# 解锁

[root@mysql5 ~]# unlock tables;

# 插入数据进行验证

注意!!!:遇到启动mysql报错时解决方案

[root@mysql5 ~]#  ps -ef | grep mysqld

mysql      3396      1  0 14:40 pts/1    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/db01-master.err --pid-file=/usr/local/mysql/data/mysql5.7.pid --socket=/tmp/mysql.sock --port=3306

root       3624   3147  0 14:43 pts/2    00:00:00 grep --color=auto mysqld

[root@mysql5 ~]# kill -9 3396

Mycat读写分离

环境准备

# mycat(192.168.2.60)  client(192.168.2.215)

配置步骤

1、上传jdk和mycat安装包

[root@mycat ~]# ls

anaconda-ks.cfg

jdk-8u192-linux-x64.tar.gz

Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

Soft

2、解压并且添加到指定的位置

[root@mycat ~]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

[root@mycat ~]# tar -xf jdk-8u192-linux-x64.tar.gz

3、查看并且配置jdk环境

[root@mycat ~]# ls

anaconda-ks.cfg

jdk1.8.0_192

jdk-8u192-linux-x64.tar.gz

mycat

Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

soft

[root@mycat ~]# ls /usr/local/jdk/

bin man

COPYRIGHT README.html

include release

javafx-src.zip src.zip

jre THIRDPARTYLICENSEREADMEJAVAFX.txt

4、将文件移动到默认启动文件目录下

[root@mycat ~]# cp -r jdk1.8.0_192/ /usr/local/jdk

[root@mycat ~]# cp -r mycat/ /usr/local/

[root@mycat ~]# sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile

[root@mycat ~]# sed -n '$p' /etc/profile

export JAVA_HOME=/usr/local/jdk

[root@mycat ~]# source /etc/profile

[root@mycat ~]#  $JAVA_HOME

-bash: /usr/local/jdk: 是一个目录

[root@mycat ~]# sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile

[root@mycat ~]# source /etc/profile

[root@mycat ~]# sed -n '$p' /etc/profile

export PATH=$PATH:$JAVA_HOME/bin

[root@mycat ~]# $PATH

-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk/bin: 没有那个文件或目录

[root@mycat ~]# ls /usr/local/mycat

bin  catlet  conf  lib  logs  version.txt

[root@mycat ~]# ls -ld /usr/local/mycat/

drwxr-xr-x. 7 root root 85 8月  15 15:20 /usr/local/mycat/

[root@mycat ~]# ll /usr/local/mycat/

总用量 12

drwxr-xr-x. 2 root root  190 8月  15 15:20 bin

drwxr-xr-x. 2 root root    6 8月  15 15:20 catlet

drwxr-xr-x. 4 root root 4096 8月  15 15:20 conf

drwxr-xr-x. 2 root root 4096 8月  15 15:20 lib

drwxr-xr-x. 2 root root    6 8月  15 15:20 logs

-rwxr-xr-x. 1 root root  219 8月  15 15:20 version.txt

[root@mycat ~]# ls /usr/local/mycat/bin/

dataMigrate.sh   startup_nowrap.sh

init_zk_data.sh  wrapper-linux-ppc-64

mycat            wrapper-linux-x86-32

rehash.sh        wrapper-linux-x86-64

5、测试启动mycat

[root@mycat ~]# /usr/local/mycat/bin/mycat consoleRunning Mycat-server...

jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log

6、找到并修改server.xmml 和schema.xml(真实数据库信息)文件

[root@mycat ~]# ls /usr/local/mycat/conf/

server.xml  schema.xml

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

7、启动服务并检查是否启动成功

[root@mycat ~]# /usr/local/mycat/bin/mycat start

Starting Mycat-server...

[root@mycat ~]# ss -lntpu|grep 8066  # 端口号

tcp    LISTEN     0      100      :::8066                 :::*                   users:(("java",pid=2098,fd=81))

8、连接测试

[root@client ~]# ls

anaconda-ks.cfg

mysql-8.0.33-linux-glibc2.12-x86_64

mysql-8.0.33-linux-glibc2.12-x86_64.tar

mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz

mysql-router-8.0.33-linux-glibc2.12-x86_64.tar.xz

mysql-test-8.0.33-linux-glibc2.12-x86_64.tar.xz

soft

[root@client ~]# cd mysql-8.0.33-linux-glibc2.12-x86_64/

[root@client mysql-8.0.33-linux-glibc2.12-x86_64]# ls

bin   include  LICENSE  README  support-files

docs  lib      man      share

[root@client mysql-8.0.33-linux-glibc2.12-x86_64]# cd bin/

[root@client bin]# ./mysql -h192.168.2.60 -P8066 -uhuajuan -phuajuan

mysql>select * from user;

+----+----------+----------+

| id | username | password |

+----+----------+----------+

|  1 | aaa      | aaa      |

+----+----------+----------+

1 row in set (0.00 sec)

mysql>show variables like "server_id";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 10 |

+---------------+-------+

1 row in set (0.00 sec)

# 实现了读写分离,master能读和插入记录,slave只能读取

mysql> show variables like 'server_id';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 11 |

+---------------+-------+

1 row in set (0.01 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】什么是内存管理?

如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…

【秋招笔试】24-08-10-OPPO-秋招笔试题(第二套)

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

2024巴黎奥运会VIS视觉设计分享学习

2024年巴黎奥运会的视觉识别系统(VIS)以其独特的设计和创意,展现了法国的优雅与活力。该设计融合了现代感与传统元素,以巴黎标志性的建筑和文化为灵感,创造出一系列令人印象深刻的视觉符号。 色彩上,采用了…

SpringCloud网关

1.网关的作用 2.网关入门 2.1引入依赖 <dependencies><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--网关--><dependency><g…

【qt】基于tcp的客户端搭建

ui界面设计 我们给客户端提供服务器的ip地址&#xff0c;以及服务器的端口号 1.界面设计 2.修改对象名称 代码实现 断开按键的槽函数处理 转到槽&#xff0c;然后实现槽函数&#xff0c;直接关闭该窗口&#xff0c;就可以了 连接槽函数编写&#xff0c;首先要支持网络通信…

C# 解析html

C#解析html库 网上查找有如下几个库 SGMLReader (好久不更新了)html-agility-pack(活跃)AngleSharp(活跃)CsQuery(好久不更新) 选择AngleSharp 原因:能向写js一样获取元素 安装AngleSharp 1.2.0-beta.431 using AngleSharp.Html.Parser;namespace HtmlParse01;class Progr…

示波法电子血压原理

血压是指血液在血管内流动时作用于单位面积血管壁的侧压力&#xff0c;它是推动血液在血管内流动的动力。在不同血管内被分别称为动脉血压、毛细血管压和静脉血压&#xff0c;通常所说的血压是指体循环的动脉血压。 血压正常范围值&#xff1a;收缩压130mmHg&#xff0c;舒张压…

【Python学习-UI界面】PyQt5 小部件9-QMenuBar,QMenuQAction 菜单栏

样式如下: 在pyqt5中直接添加就行&#xff0c;子项只能输入英文&#xff0c;输入中文的方式待研究 一个水平的 QMenuBar 位于QMainWindow对象的标题栏下方&#xff0c;用于显示QMenu对象。 QMenu 类提供了一个可以添加到菜单栏的小部件。它还用于创建上下文菜单和弹出菜单。…

基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

SpringCloud完整教程

一下内容为本人在听黑马程序员的课程时整理的 微服务技术栈 ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ 1、微服务框架 1.1、认识微服务 1.1.1、服务架构演变 **单体架构&#xff1a;**将业务的所有功能集中在一个项目中开发&#xff0c;打包成…

TypeScript 编译选项

编译TS 编译 .ts 文件&#xff1a; tsc app.ts执行命令tsc app.ts 可以把 单个文件 app.ts编译成 app.js。 这个命令需要每次编译时手动执行。 自动编译文件 tsc app.ts -w // 或者 tsc app.ts --watch通常 -w 或 --watch 指令用于启动 TypeScript 编译器的监视模式。 编译…

梅丽尔·斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越”

梅丽尔斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越” 2024-08-14 20:38 发布于&#xff1a;河北省 该中心将为美国演员工会和美国电视广播艺人协会的艺术家提供资源和机会&#xff0c;而且全部免费 同时命名的还有汤姆汉克斯和丽塔威尔逊放映室、妮可…

工业WiFi网关在工业领域的具体应用-天拓四方

工业WIFI网关在工业领域的应用已经变得极为广泛&#xff0c;它不仅是连接工业设备、传感器与云平台之间的桥梁&#xff0c;更是推动工业智能化和自动化的重要动力。下面将进一步详细介绍工业WiFi网关在工业领域的一些具体应用。 工业自动化生产&#xff1a; 在工业自动化生产…

算法力扣刷题记录 八十一【343. 整数拆分】

前言 动态规划第8篇。记录 八十一【343. 整数拆分】 一、题目阅读 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。返回 最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 …

货代企业转型海外仓,会面临哪些难点?

根据数据统计&#xff0c;跨境电商出口B2C物流市场规模已经达到3825亿元&#xff0c;其中海外仓物流以2102亿的规模以及55%的市场份额成为主流。从细分领域看&#xff0c;其中FBA物流、第三方仓、自建仓的市场规模分别达到1156亿、736亿、210亿。 在跨境物流行业中&#xff0c…

uniapp粘贴板地址识别 address-parse插件的使用

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

QT、C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

并发编程 | 线程池的手动创建

手动创建线程的弊端 在前面我们讲了手动创建线程的使用方式&#xff1a;当一个任务过来&#xff0c;创建一个线程&#xff0c;线程执行完了任务马上又销毁&#xff0c;然后下一次任务过来又重新创建线程&#xff0c;执行完任务再销毁&#xff0c;周而复始。 那么会导致这样一…

【数据结构】-----红黑树

目录 前言 一、what is it&#xff1f; 二、How achieve it&#xff1f; Ⅰ、结点类 Ⅱ、实现 插入 情况一&#xff1a;叔叔存在且为红色 情况二&#xff1a;叔叔不存在或者叔叔为黑色 旋转 验证 ①验证中序遍历 ②验证是否满足红黑树的性质 Ⅲ、完整实现代码 三、A…

【课程总结】day22:Qwen模型的体验

前言 在上一章【课程总结】day21&#xff08;下&#xff09;&#xff1a;大模型的三大架构及T5体验中&#xff0c;我们体验了Encoder-Decoder架构的T5模型。本章内容&#xff0c;我们将以Decoder-Only架构的Qwen模型入手&#xff0c;了解Qwen模型结构、聊天模板的概念以及通过…