一、mysql主从搭建(一主两从)
1、将配置文件拷贝到宿主机本地,每个节点都执行一次
mkdir -p /home/docker/mysql
cd /home/docker/mysql
docker run -d --rm --name mysql -e MYSQL_ROOT_PASSWORD=123456 cuiyf/mysql:5.7
docker cp mysql:/etc/mysql .
mv mysql config
docker stop mysql
2、修改配置文件
master配置
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
symbolic-links=0
# 必要配置
log-bin=mysql-bin
server-id=1
binlog_format=ROW
# 可选配置
binlog-ignore-db=mysql //不同步的数据库(mysql通常不同步)
binlog-do-db=db_name //同步的数据库
## 开启GTID ##
gtid_mode=on
enforce_gtid_consistency=on
slaver1配置
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
symbolic-links=0
# 必要配置
server-id=2
relay-log=relay-bin
## 开启GTID ##
gtid_mode=on
enforce_gtid_consistency=on
slaver2配置
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
symbolic-links=0
# 必要配置
server-id=3
relay-log=relay-bin
## 开启GTID ##
gtid_mode=on
enforce_gtid_consistency=on
3、启动mysql容器
docker run -d --name mysql-master -p 4567:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-v /home/docker/mysql/config/:/etc/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
cuiyf/mysql:5.7
docker run -d --name mysql-slaver1 -p 4567:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-v /home/docker/mysql/config/:/etc/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
cuiyf/mysql:5.7
docker run -d --name mysql-slaver2 -p 4567:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-v /home/docker/mysql/config/:/etc/mysql \
-v /home/docker/mysql/data:/var/lib/mysql \
cuiyf/mysql:5.7
4、配置主从
master创建复制用户
docker@docker1:~/mysql$ docker exec -it mysql-master bash
mysql> grant replication slave on *.* to repl@'192.168.99.101' identified by '123456';
mysql> grant replication slave on *.* to repl@'192.168.99.102' identified by '123456';
查看master状态
docker@docker1:~/mysql$ docker exec -it mysql-master bash
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 | 786 | | | d20cafcf-efc6-11e9-bdcc-0242ac110004:1-7 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
登录从库建立主从复制,Slave_IO_Running
和Slave_SQL_Running
均为Yes
即可
# 未开启GTID
mysql> change master to \
master_user='repl', \
master_password='123456', \
master_host='192.168.99.100', \
master_port=4567, \
master_log_file='mysql-bin.000003', \
master_log_pos=786;
# 开启GTID
mysql> change master to \
master_user='repl', \
master_password='123456', \
master_host='192.168.99.100', \
master_port=4567, \
master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.99.100
Master_User: repl
Master_Port: 4567
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 786
Relay_Log_File: 9efd667c9e4b-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
5、验证主从
在从库创建一个数据库
mysql> create database cyf;
查看从库是否同步这个数据库,存在即证明主从复制搭建完毕
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cyf |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
二、基于360atlas插件建立读写分离
1、配置文件准备
mkdir -p /home/docker/atlas/conf
cd /home/docker/atlas/conf
vi test.cnf
[mysql-proxy]
#管理接口的用户名
admin-username=root
#管理接口的密码
admin-password=123456
#实现管理接口的Lua脚本所在路径
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses=192.168.99.100:4567
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses=192.168.99.101:4567,192.168.99.102:4567
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
daemon=false
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
keepalive=true
#工作线程数,推荐设置与系统的CPU核数相等
event-threads=4
#日志级别,分为message、warning、critical、error、debug五个级别
log-level=message
#日志存放的路径
log-path=/usr/local/mysql-proxy/log
#实例名称,用于同一台机器上多个Atlas实例间的区分
instance=test
#Atlas监听的工作接口IP和端口
proxy-address=0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address=0.0.0.0:2345
#连接池的最小空闲连接数,应设为event-threads的整数倍,可根据业务请求量大小适当调大或调小
min-idle-connections=8
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,此设置项用于多个用户名同时访问同一个Atlas实例的情况,若只有一个用户名则不需要设置该项
#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
#默认字符集,若不设置该项,则默认字符集为latin1
charset = utf8
#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1
client-ips=
2、启动360atlas
docker run -d -p 1234:1234 -p 2345:2345 --name 360atlas \
-v /home/docker/atlas/conf/:/usr/local/mysql-proxy/conf \
-v /home/docker/atlas/logs:/usr/local/mysql-proxy/log \
cuiyf/atlas:1.0.0
3、验证读写分离搭建成功
登录管理几点查看主从状态,state
均为up
即可,客户端连接1234
端口即可完成读写分离
mysql -h192.168.99.100 -uroot -p123456 -P2345
mysql> SELECT * FROM backends;
+-------------+---------------------+-------+------+
| backend_ndx | address | state | type |
+-------------+---------------------+-------+------+
| 1 | 192.168.99.100:4567 | up | rw |
| 2 | 192.168.99.101:4567 | up | ro |
| 3 | 192.168.99.102:4567 | up | ro |
+-------------+---------------------+-------+------+
3 rows in set (0.00 sec)
设置1234端口登录的用户密码:
mysql -h192.168.99.100 -uroot -p123456 -P2345
mysql> add pwd root:123456;
Empty set (0.00 sec)
mysql> save config;
Empty set (0.01 sec)
其他管理命令如下:
mysql> SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command | description |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help | shows this help |
| SELECT * FROM backends | lists the backends and their state |
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id | online backend server, ... |
| ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |
| ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ... |
| SELECT * FROM clients | lists the clients |
| ADD CLIENT $client | example: "add client 192.168.1.2", ... |
| REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... |
| SELECT * FROM pwds | lists the pwds |
| ADD PWD $pwd | example: "add pwd user:raw_password", ... |
| ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... |
| REMOVE PWD $pwd | example: "remove pwd user", ... |
| SAVE CONFIG | save the backends to config file |
| SELECT VERSION | display the version of Atlas |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)
```