搭建一个mysql集群,1主2从,使用docker容器
一、创建docker的mysql镜像
下次补上,因为现在很多网络不能直接pull,操作下次补上。
二、创建mysql容器
创建容器1
docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --ip 172.18.0.2 -m 400m -v /root/mysql_1/data:/var/lib/mysql -v /root/mysql_1/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=abc123456 -e TZ=Asia/Shanghai --privileged=true mysql:5.7 --lower_case_table_names=1
执行成功后,
查看:docker ps -a
说明部署成功了,先暂停这个容器:docker stop mysql_1
接着在/root/mysql_1/config/下创建my.cnf
[mysqld]
character_set_server=utf8
server_id=1
log_bin=mysql_bin
relay_log=relay_bin
log-slave-updates=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
重新启动mysql_1容器:docker start mysql_1
进入容器,docker exec -it mysql_1 bash
添加数据库账号与设置权限
mysql -uroot -pabc123456
添加一个账号为sync,密码为:abc123456的有同步数据权限的账号,这个步骤参考以下方法。如果能用navicat连接上这个数据库,也可以用工具直接创建这个账号与赋权限,个人测试的直接授所有权限。
mysql 创建用户
方法一:
使用CREATE USER语句来创建用户。以下是一个示例:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
该语句将在MySQL数据库中创建一个名为'username'的用户,并为该用户设置密码为'password'。用户只能从本地主机连接到数据库。
方法二:
使用GRANT语句创建用户。以下是一个示例:
GRANT ALL PRIVILEGES ON . TO 'username'@'localhost' IDENTIFIED BY 'password';
该语句将为名为'username'的用户授予对所有数据库和表的全部权限,并设置密码为'password'。用户只能从本地主机连接到数据库。
注意:在实际生产环境中,应根据需要为用户分配适当的权限,而不是赋予全部权限。
方法三:
使用INSERT INTO语句将用户信息插入到mysql.user表中。以下是一个示例:
INSERT INTO mysql.user (User, Host, Password) VALUES ('username', 'localhost', PASSWORD('password'));
该语句将在mysql.user表中插入一条记录,包含用户名为'username'、主机为'localhost'和使用PASSWORD函数加密的密码。用户只能从本地主机连接到数据库。
需要注意的是,为了使新用户生效,必须使用FLUSH PRIVILEGES语句刷新MySQL的权限缓存:
FLUSH PRIVILEGES;
创建容器2
docker run -it -d --name mysql_2 -p 7002:3306 --net mynet --ip 172.18.0.3 -m 400m -v /root/mysql_2/data:/var/lib/mysql -v /root/mysql_2/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=abc123456 -e TZ=Asia/Shanghai --privileged=true mysql:5.7 --lower_case_table_names=1
执行成功后,
查看:docker ps -a
说明部署成功了,先暂停这个容器:docker stop mysql_2
接着在/root/mysql_2/config/下创建my.cnf
[mysqld]
character_set_server=utf8
server_id=2
log_bin=mysql_bin
relay_log=relay_bin
read-only=1
#log-slave-updates=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
重新启动mysql_2容器:docker start mysql_2
使用navicat连接,并设置
stop slave;
change master to master_host='172.18.0.2',master_port=3306,master_user='sync',master_password='abc123456'
start slave;
show slave status;
一条条执行,前面都是执行结果为OK
最后一条的显示为:这就说明从库设置成功!
创建容器3
docker run -it -d --name mysql_2 -p 7003:3306 --net mynet --ip 172.18.0.4 -m 400m -v /root/mysql_3/data:/var/lib/mysql -v /root/mysql_3/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=abc123456 -e TZ=Asia/Shanghai --privileged=true mysql:5.7 --lower_case_table_names=1
执行成功后,
查看:docker ps -a
说明部署成功了,先暂停这个容器:docker stop mysql_3
接着在/root/mysql_3/config/下创建my.cnf
[mysqld]
character_set_server=utf8
server_id=3
log_bin=mysql_bin
relay_log=relay_bin
read-only=1
#log-slave-updates=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
重新启动mysql_3容器:docker start mysql_3
使用navicat连接,并设置
stop slave;
change master to master_host='172.18.0.2',master_port=3306,master_user='sync',master_password='abc123456'
start slave;
show slave status;
一条条执行,前面都是执行结果为OK
最后一条的显示为:这就说明从库设置成功!
在主库上创建一个数据库与数据表
在从库上自动添加了这个库与表