Mysql主主复制和读写分离(全过程)
搭建环境:
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 master27、分别进入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、端口、用户名、密码是否正确。
本篇完。