Mysql主主复制和读写分离(全过程)

2019-04-29  本文已影响0人  歪歪嘴的小不点


搭建环境:

centos7:3.10.0-327.el7.x86_64

docker:1.12.6, build 78d1802

mysql:5.7.13

mycat:1.6

搭建准备:

安装docker

拉取mysql镜像

解压mycat压缩包

开始搭建:

1、创建并启动容器,以及映射mysql数据

docker run --name mysql-master1 -e MYSQL_ROOT_PASSWORD=root -v /data/mysql_data:/var/lib/mysql -d -i -p 3306:3306 mysql:5.7.13 

2、进入容器

①进入docker

docker exec -it mysql-master1 /bin/bash

②进入mysql,并输入密码root

mysql -u root -p

3、新建用户,新建数据库,赋予权限(如果需要的话)

①新建用户 user ,设置密码 123456

CREATE USER 'user'@'%.%.%.%' IDENTIFIED BY '123456';

②创建数据库testdb,并指定字符编码

CREATE DATABASE IF NOT EXISTS `testdb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

③赋予权限

GRANT ALL PRIVILEGES ON `testdb`.* TO 'user'@'%.%.%.%';

4、修改mysql配置文件,为主主复制做准备

①将docker中的mysql的配置文件拷贝到当前目录(容器里面没有vi,拷贝出来修改再拷贝回去,效果一样)

docker cp mysql-master1: /etc/mysql/mysql.conf.d/mysqld.cnf .

②修改,在[mysqld]第一行加入如下内容(server-id的值可以任意,保证2个节点值不同即可):

server-id=101

log-bin=mysql-bin

log-bin-trust-function-creators=1

lower_case_table_names = 1

replicate-do-db=testdb

③拷贝回去

docker cp mysqld.cnf mysql-master1: /etc/mysql/mysql.conf.d/

④重启容器

docker restart mysql-master1

5、新建mysql-master2容器(具体步骤和新建mysql-master1节点一样,有个地方要改一下)

4-②步骤(值不用和我一样,保证前后值不同即可):

server-id=101 修改为server-id=102

6、重新进入容器,并进入mysql,加锁,获取bin文件的名称和位置

①进入mysql后,锁表(如果该表不在使用,不加锁也可以)

flush tables with read lock;

②获取bin文件信息

show master status;

③记录名称和位置(我这里,master1是mysql-bin.000003和13784608,master2是mysql-bin.000001和1588591)

master1 master2

7、分别进入2个容器的mysql,执行命令,这样子2个容器才能读取互相的bin文件内容(数据库的操作会记录到bin文件中,这样子以实现互相复制)

①进入master1容器的mysql,执行命令(x.x.x.x是master2容器主机的ip,3306是端口,然后是数据库的用户名和密码,然后是master2容器的bin文件名称和位置)

change master to master_host=‘x.x.x.x',

master_port=3306,

master_user='root',

master_password='root',

master_log_file='mysql-bin.000001',

master_log_pos=1588591;

①进入master2容器的mysql,执行命令(x.x.x.x是master1容器主机的ip,3306是端口,然后是数据库的用户名和密码,然后是master1容器的bin文件名称和位置)

change master to master_host=‘x.x.x.x',

master_port=3306,

master_user='root',

master_password='root',

master_log_file='mysql-bin.000003',

master_log_pos=13784608;

8、查看复制状态(Slave_IO_Running和Slave_SQL_Running的状态为YES)

show slave status\G;

9、2个mysql分别解锁,开启复制,完工

unlock tables;

start slave;

读写分离(mycat):

1、进入mycat的conf目录下,分别修改schema.xml和server.xml

①schema.xml修改如下:

schema.xml

配置说明:

schema标签:name可以任意,server.xml用到,dataNode的值,是dataNode标签的name

dataNode标签:name需要与schema标签的dataNode一样,dataHost是dataHost标签的name,database即为你需要读写分离的数据库

dataHost标签:name同理,balance=3,表示所有读请求,随机分发到writeHost对应的readHost上,writeHost不分担读压力,writeType=0,表示所有写请求分配到一个配置的writeHost上,第一个挂了,会自动切换到第二个writeHost, switchType=2,表示根据主从状态决定是否切换,检测语句是:show slave status

②server.xml修改如下:

server.xml末尾内容

在server.xml末尾添加如上内容,用户名和密码是连接mycat的用户名和密码,schemas即是我们在schema.xml中配置的schema标签的name,如果配置了多个,用逗号隔开。如果加上<property name="readonly">true</property>,表示该用户只读。

在该配置文件中,还可以修改很多属性,比如:服务绑定地址,服务端口,管理端口等等,可自行修改。

③修改保存后,进入bin目录,执行命令:./mycat start 即可启动mycat服务

④启动日志,放在logs目录下,wrapper.log文件为启动日志,如果启动失败,可以查看该文件,mycat.log文件为服务日志,查看该文件可以判断服务是否正常,如果出现了连接某个mysql节点失败,请检查schema.xml中配置的ip、端口、用户名、密码是否正确。

本篇完。

上一篇下一篇

猜你喜欢

热点阅读