搭建目的:
由于前几日在于一家公司hr交流中得知他们公司需要搭建存储得集群,于是决定自己利用虚拟机和docker部署一个mysql主从集群,其中也遇到了一些问题,在此进行一些记录;
搭建过程:
一)docker命令拉取mysql镜像
此处由于我并没有具体得实际应用需求,就从docker官网拉取了最新版本得mysql镜像,此处附上docker镜像官网地址 mysql - Official Image | Docker Hubhttps://hub.docker.com/_/mysql
拉取完毕后,在服务器上运行如下命令:
docker images;
可以看到MySQL已经拉取成功;
二)创建docker容器,运行MySQL
使用下载完成得镜像创建容器:
Master(主节点):
docker run -p 3301:3306 --name master -e MYSQL_ROOT_PASSWORD=1234 -d mysql
Slave(从节点):
docker run -p 3302:3306 --name slave -e MYSQL_ROOT_PASSWORD=1234 -d mysql
注:-d 后跟得是镜像名称 我的mysql镜像名称就是mysql,读者需根据具体情况进行修改
容器创建完毕后,可以利用数据库管理工具进行外部连接。
1)Master节点用户创建
进入容器:
docker exec -it 容器ID /bin/bash
登录MySQL:
mysql -uroot -p 密码
注意:此处要用root账户登录,不然会报错
查询是否允许外部访问:
use mysql;
select host,user from user;
可以看到,并没有我们创建得用户(暂时也不知道为啥)。
所以我们需要重新创建用户:
CREATE USER 用户名@'%' IDENTIFIED BY '密码'; -- 创建用户并指定密码
GRANT ALL PRIVILEGES ON *.* TO 用户名@'%' WITH GRANT OPTION; --授权
创建完成再次进行查询:
可以看到,出现了一个新用户(我创建得名称为master),并且可以进行外部连接
注:host为%即允许外部所有ip连接,如果有安全需求可以改为固定ip
再次进行连接,应该就可以成功了
2)Slave节点用户创建
大体步骤与Master节点得创建步骤相同
但是为了后期实现读写分离,最好只给slave节点赋予读权限:
CREATE USER 用户名@'%' IDENTIFIED BY '密码'; -- 创建用户并指定密码
GRANT SELECT ON *.* TO '用户名'@'%'; --授权
三)搭建集群配置
1)Master节点的配置
docker内部安装vim
apt-get update
apt-get install vim
注:如果进度条不动,遇到报错
可以尝试在容器外修改docker配置:
修改此路径文件
vim /etc/docker/daemon.json
添加如下配置,注意配置之间用“,”隔开
重新进行vim下载
下载完成后执行如下命令:
vim /etc/mysql/my.cnf
在文件中添加如下配置:
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed
binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启
service mysql restart
重启会导致docker容器停止,使用如下命令重新启动容器:
docker start mysql-master
重新进入master节点
创建数据库同步账户并授权:
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '密码';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
至此,master节点配置完毕;
2)Slave节点的配置
类似于Master,使用docker命令docker exec -it mysql-slave /bin/bash
进入到slave容器中,进入到etc/mysql
路径,使用vim
命令编辑my.cnf
文件:
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读,该项如果不设置,表示slave可读可写
四)连接主从节点
1)进入master节点,查看状态
进入master节点的mysql客户端,执行如下命令:
show master status
注意:记录此处的File和Position值,后面需要用到;
2)进入从节点,连接主节点
注:由于要上文只给从节点用户授予了读权限,此处需要用root用户进入从节点;
change master to master_host='主节点服务器ip', master_user='slave', master_password='1234', master_port=3301, master_log_file='master-bin.000002', master_log_pos=718, master_connect_retry=30;
master_host: Master所处的服务器IP
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
运行
show slave status \G
查看主从节点状态;
此处由于没有开启主从复制,所以两处都是NO;
开启主从复制:
start slave
再次查看状态,发现两处都变为Yes;
至此,完成主从搭建
3)测试
想验证是否完成主从同步,只需在主节点创建一个数据库,查看从节点是否能到查询到即可;
以下是实际操作:
由此可见,在主节点创建了一个名为userdb的数据库;
再去查看从节点:
成功查询到userdb;
并且由于我们只给从节点授予了读权限,所以他不能对数据库进行修改;
至此 数据库的主从搭建完成!
五)总结
虽然对于学习过程中,搭建的mysql集群还没有什么实际应用;
但是对于以后的工作,这个搭建的经验应该还是有用武之处的;
最后,各位朋友在搭建过程中有任何问题,都可以通过QQ:735205643联系我,
一同探讨学习!