k8s实践之mysql集群搭建(十五)

先下载 k8s实践之mysql集群搭建资料

k8s实践之mysql集群搭建(十五)_第1张图片

主从模式简介:

当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集群有hostnamenode-1node-2node-3的三台主机。首先,在宿主机上创建一个挂载点,比如/mnt/disks,然后用 RAM Disk 来模拟本地磁盘,在node-1上执行:

$ mkdir /mnt/disks

$ mkdir /mnt/disks/vol1

$ mount -t tmpfs vol1 /mnt/disks/vol1

在其余两台主机执行时,将路径替换为vol2vol3以作区分。

然后为这些本地磁盘定义对应的 PVpv-1.yamlpv-2.yamlpv-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

你可能感兴趣的:(k8s技术,mysql,数据库,服务器)