先下载 k8s实践之mysql集群搭建资料
主从模式简介:
当master主服务器上的数据发生改变时,则将其改变写入二进制(binlog)事件日志文件中;
slave从服务器会在一定时间间隔内对master主服务器上的二进制日志进行探测,探测其是否发生过改变(通过二进制文件的大小是否不同来进行判断,日志文件改变了的大小也可以叫作偏移),如果探测到master主服务器的二进制事件日志发生了改变,则开始一个I/O Thread请求master二进制事件日志;
同时master主服务器为每个I/O Thread启动一个dump thread,用于向其发送二进制事件日志;
slave从服务器将接收到的二进制事件日志写到自己本地的(relay日志)中继日志文件中;
slave从服务器将启动SQL Thread从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;
最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次唤醒;
主从复制的过程会有很小的延迟,基本没有影响。
1.local pv的搭建
假设我们的k8s集群有hostname为node-1,node-2,node-3的三台主机。首先,在宿主机上创建一个挂载点,比如/mnt/disks,然后用 RAM Disk 来模拟本地磁盘,在node-1上执行:
$ mkdir /mnt/disks
$ mkdir /mnt/disks/vol1
$ mount -t tmpfs vol1 /mnt/disks/vol1
在其余两台主机执行时,将路径替换为vol2、vol3以作区分。
然后为这些本地磁盘定义对应的 PV,pv-1.yaml、pv-2.yaml、pv-3.yaml,注释的地方为需要替换的地方
2.mysql配置文件ConfigMap
Master 节点和 Slave 节点需要有不同的配置文件:我们只需要给主从节点分别准备两份不同的 MySQL 配置文件,然后根据 Pod 的序号(Index)挂载进去即可。这样的配置文件信息,应该保存在 ConfigMap 里供 Pod 使用。
3.Service的定义
这两个 Service 都代理了所有携带 app=mysql 标签的 Pod,也就是所有的 MySQL Pod。端口映射都是用 Service 的 3306 端口对应 Pod 的 3306 端口。
所有用户的读请求,都必须访问第二个 Service 被自动分配的 DNS 记录,即mysql-read。这样,读请求就可以被转发到任意一个 MySQL 的主节点或者从节点上。而所有用户的写请求,则必须直接以 DNS 记录的方式访问到 MySQL 的主节点,即mysql-0.mysql这条 DNS 记录。
4.StatefulSet的定义
init-mysql从 ConfigMap 中,获取 MySQL 的 Pod 对应的配置文件,根据节点的角色是 Master 还是 Slave 节点,为 Pod 分配对应的配置文件。此外,MySQL 还要求集群里的每个节点都有一个唯一的 ID 文件,名叫 server-id.cnf。
clone-mysql在 Slave Pod 启动前,从 Master 或者其他 Slave Pod 里拷贝数据库数据到自己的目录下。
xtrabackup在 Slave 节点的 MySQL 容器第一次启动之前,执行初始化 SQL。
mysql是集群里Mysql容器的定义。
5.集群操作
查看集群状态:
kubectl get pod -l app=mysql
向这个 MySQL 集群发起写请求:
$ kubectl run mysql-client --image=mysql:5.7 -i --
rm --restart=Never --\
mysql -h mysql-0.mysql <<
EOF
CREATE DATABASE test;
CREATE TABLE test.messages (message VARCHAR(250));
INSERT INTO test.messages VALUES ('hello');
EOF
向这个 MySQL 集群发起读请求:
$ kubectl run mysql-client --image=mysql:5.7 -i -t --
rm --restart=Never --\
mysql -h mysql-read -e
"SELECT * FROM test.messages"
Waiting
for pod default/mysql-client to be running, status is Pending, pod ready:
false
+---------+
| message |
+---------+
| hello |
+---------+
pod
"mysql-client" deleted
集群的伸缩:
$ kubectl scale statefulset mysql --replicas=2