Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. # 利用K8S部署一主n从的MySQL数据库
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5. name: mysql
  6. namespace: test
  7. spec:
  8. selector:
  9. matchLabels:
  10. qcloud-app: mysql
  11. serviceName: mysql
  12. # 3个副本,在这里是一主两从
  13. replicas: 3
  14. template:
  15. metadata:
  16. labels:
  17. qcloud-app: mysql
  18. spec:
  19. initContainers:
  20. # init-mysql 用于给 mysql 容器按主从身份给对应的配置文件
  21. - name: init-mysql
  22. image: mysql:5.7
  23. command:
  24. - bash
  25. - "-c"
  26. - |
  27. set -ex
  28. # 按pod启动顺序ID,生成server-id
  29. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
  30. ordinal=${BASH_REMATCH[1]}
  31. echo [mysqld] > /mnt/conf.d/server-id.cnf
  32. # Add an offset to avoid reserved server-id=0 value.
  33. echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
  34. # Copy appropriate conf.d files from config-map to emptyDir.
  35. # 只有第一个Pod做Master,其他Pod都是Slave
  36. if [[ $ordinal -eq 0 ]]; then
  37. cp /mnt/config-map/master.cnf /mnt/conf.d/
  38. else
  39. cp /mnt/config-map/slave.cnf /mnt/conf.d/
  40. fi
  41. volumeMounts:
  42. - name: conf
  43. mountPath: /mnt/conf.d
  44. - name: config-map
  45. mountPath: /mnt/config-map
  46. # clone-mysql 的目的是让 Slave在初始化的时候从上一个Pod复制数据
  47. # 还有一个 xtrabackup 容器在3307端口提供了备份服务
  48. - name: clone-mysql
  49. image: gcr.io/google-samples/xtrabackup:1.0
  50. command:
  51. - bash
  52. - "-c"
  53. - |
  54. set -ex
  55. # 如果已经有初始数据,如:之前启动过,就跳过克隆,走mysql的内部同步机制
  56. [[ -d /var/lib/mysql/mysql ]] && exit 0
  57. # 如果是Master就跳过这个克隆过程
  58. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
  59. ordinal=${BASH_REMATCH[1]}
  60. [[ $ordinal -eq 0 ]] && exit 0
  61. # 从上一个Pod的xtrabackup服务克隆数据
  62. ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
  63. # Prepare the backup.
  64. xtrabackup --prepare --target-dir=/var/lib/mysql
  65. volumeMounts:
  66. - name: data
  67. mountPath: /var/lib/mysql
  68. # 用subPath是为了避免pvc根目录下面存在文件或者目录, 影响mysql启动, subPath不存在时会自动创建
  69. subPath: mysql
  70. - name: conf
  71. mountPath: /etc/mysql/conf.d
  72. containers:
  73. - name: mysql
  74. image: mysql:5.7
  75. env:
  76. # 这里root使用了空密码, 生产环境可以从secret读取密码到环境变量MYSQL_ROOT_PASSWORD
  77. - name: MYSQL_ALLOW_EMPTY_PASSWORD
  78. value: "1"
  79. ports:
  80. - name: mysql
  81. containerPort: 3306
  82. volumeMounts:
  83. - name: data
  84. mountPath: /var/lib/mysql
  85. subPath: mysql
  86. - name: conf
  87. mountPath: /etc/mysql/conf.d
  88. resources:
  89. requests:
  90. cpu: 500m
  91. memory: 1Gi
  92. livenessProbe: # 存活检查
  93. exec:
  94. command: ["mysqladmin", "ping"]
  95. initialDelaySeconds: 30
  96. periodSeconds: 10
  97. timeoutSeconds: 5
  98. readinessProbe: # 可服务检查
  99. exec:
  100. # Check we can execute queries over TCP (skip-networking is off).
  101. command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
  102. initialDelaySeconds: 5
  103. periodSeconds: 2
  104. timeoutSeconds: 1
  105. # xtrabackup 在3307端口提供备份服务, 如果是slave节点,通知mysqld以slave模式启动
  106. - name: xtrabackup
  107. image: gcr.io/google-samples/xtrabackup:1.0
  108. ports:
  109. - name: xtrabackup
  110. containerPort: 3307
  111. command:
  112. - bash
  113. - "-c"
  114. - |
  115. set -ex
  116. cd /var/lib/mysql
  117.  
  118. # Determine binlog position of cloned data, if any.
  119. if [[ -f xtrabackup_slave_info ]]; then
  120. # 正在从Slave克隆
  121. mv xtrabackup_slave_info change_master_to.sql.in
  122. # 删除没用的xtrabackup_binlog_info
  123. rm -f xtrabackup_binlog_info
  124. elif [[ -f xtrabackup_binlog_info ]]; then
  125. # 正在从Master克隆. 解析 binlog 的位置.
  126. [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
  127. # xtrabackup_binlog_info的格式: binlog文件名 binlog_pos
  128. rm xtrabackup_binlog_info
  129. echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
  130. MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
  131. fi
  132.  
  133. # Check if we need to complete a clone by starting replication.
  134. if [[ -f change_master_to.sql.in ]]; then
  135. # 等待同Pod的mysql容器启动
  136. echo "Waiting for mysqld to be ready (accepting connections)"
  137. until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
  138.  
  139. echo "Initializing replication from clone position"
  140. # 改名change_master_to.sql.in, 避免重启的时候又执行了一次
  141. mv change_master_to.sql.in change_master_to.sql.orig
  142. # 连接到本pod的mysql服务, 切换为slave模式
  143. # sql: CHANGE MASTER TO MASTER_LOG_FILE='binlog文件名', MASTER_LOG_POS=binlog位置,
  144. # MASTER_HOST='mysql-0.mysql',
  145. # MASTER_USER='root',
  146. # MASTER_PASSWORD='',
  147. # MASTER_CONNECT_RETRY=10;
  148. # sql: START SLAVE;
  149. mysql -h 127.0.0.1 <<EOF
  150. $(<change_master_to.sql.orig),
  151. MASTER_HOST='mysql-0.mysql',
  152. MASTER_USER='root',
  153. MASTER_PASSWORD='',
  154. MASTER_CONNECT_RETRY=10;
  155. START SLAVE;
  156. EOF
  157. fi
  158.  
  159. # 在3307端口上为其他pods提供克隆服务, ncat成为0号主进程
  160. exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
  161. "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
  162. volumeMounts:
  163. - name: data
  164. mountPath: /var/lib/mysql
  165. subPath: mysql
  166. - name: conf
  167. mountPath: /etc/mysql/conf.d
  168. resources:
  169. requests:
  170. cpu: 100m
  171. memory: 100Mi
  172. volumes:
  173. - name: conf
  174. emptyDir: {}
  175. - name: config-map
  176. configMap:
  177. name: mysql
  178. volumeClaimTemplates:
  179. # 每个节点都是用10GB的存储空间
  180. - metadata:
  181. name: data
  182. spec:
  183. # 独占读写
  184. accessModes: ["ReadWriteOnce"]
  185. resources:
  186. requests:
  187. storage: 10Gi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement