mysql-slave-pvc.yaml 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. ---
  2. # 1. ConfigMap
  3. apiVersion: v1
  4. kind: ConfigMap
  5. metadata:
  6. name: mysql-slave-config
  7. namespace: mysql
  8. data:
  9. my.cnf: |
  10. [mysqld]
  11. server-id=2
  12. relay-log=mysql-relay-bin
  13. log-bin=mysql-bin
  14. binlog-format=ROW
  15. gtid-mode=ON
  16. enforce-gtid-consistency=ON
  17. skip-replica-start=ON
  18. default-authentication-plugin=mysql_native_password
  19. bind-address=0.0.0.0
  20. # 注意:不要在这里设置 read_only 或 super_read_only
  21. # 这些应该在复制配置完成后再设置
  22. ---
  23. # 2. PersistentVolume (Slave专用)
  24. apiVersion: v1
  25. kind: PersistentVolume
  26. metadata:
  27. name: mysql-slave-pv
  28. namespace: mysql
  29. labels:
  30. app: mysql
  31. role: slave
  32. spec:
  33. capacity:
  34. storage: 10Gi
  35. accessModes:
  36. - ReadWriteOnce
  37. persistentVolumeReclaimPolicy: Retain
  38. storageClassName: manual-slave
  39. hostPath:
  40. path: "/home/lq/mysql/slave/data" # 修改为你的本地路径
  41. type: DirectoryOrCreate
  42. ---
  43. # 3. PersistentVolumeClaim (Slave专用)
  44. apiVersion: v1
  45. kind: PersistentVolumeClaim
  46. metadata:
  47. name: mysql-slave-pvc
  48. namespace: mysql
  49. labels:
  50. app: mysql
  51. role: slave
  52. spec:
  53. storageClassName: manual-slave
  54. accessModes:
  55. - ReadWriteOnce
  56. resources:
  57. requests:
  58. storage: 10Gi
  59. ---
  60. # 4.Server配置
  61. apiVersion: v1
  62. kind: Service
  63. metadata:
  64. name: mysql-slave
  65. namespace: mysql
  66. labels:
  67. app: mysql
  68. role: slave
  69. spec:
  70. ports:
  71. - port: 3306
  72. name: mysql
  73. selector:
  74. app: mysql
  75. role: slave
  76. ---
  77. # 5. Deployment
  78. apiVersion: apps/v1
  79. kind: Deployment
  80. metadata:
  81. name: mysql-slave
  82. namespace: mysql
  83. labels:
  84. app: mysql
  85. role: slave
  86. spec:
  87. replicas: 1
  88. selector:
  89. matchLabels:
  90. app: mysql
  91. role: slave
  92. strategy:
  93. type: Recreate # 重要:MySQL Slave也需要单实例
  94. template:
  95. metadata:
  96. labels:
  97. app: mysql
  98. role: slave
  99. spec:
  100. containers:
  101. - name: mysql
  102. image: mysql:8.0.44
  103. env:
  104. - name: MYSQL_ROOT_PASSWORD
  105. value: "Lq123456!"
  106. ports:
  107. - containerPort: 3306
  108. volumeMounts:
  109. - name: config
  110. mountPath: /etc/mysql/conf.d/
  111. resources:
  112. requests:
  113. memory: "512Mi"
  114. cpu: "250m"
  115. lifecycle:
  116. postStart:
  117. exec:
  118. command:
  119. - /bin/bash
  120. - -c
  121. - |
  122. # 等待MySQL完全启动
  123. echo "等待MySQL启动..."
  124. for i in {1..30}; do
  125. if mysql -uroot -pLq123456! -e "SELECT 1" &>/dev/null; then
  126. echo "MySQL已启动"
  127. break
  128. fi
  129. echo "等待MySQL... ($i/30)"
  130. sleep 2
  131. done
  132. # 配置复制
  133. echo "配置主从复制..."
  134. mysql -uroot -pLq123456! <<EOF
  135. STOP REPLICA;
  136. RESET REPLICA ALL;
  137. CHANGE REPLICATION SOURCE TO
  138. SOURCE_HOST='mysql-master',
  139. SOURCE_USER='replica',
  140. SOURCE_PASSWORD='Replica123456!',
  141. SOURCE_AUTO_POSITION=1;
  142. START REPLICA;
  143. EOF
  144. # 设置只读模式
  145. echo "设置只读模式..."
  146. mysql -uroot -pLq123456! -e "SET GLOBAL read_only = ON; SET GLOBAL super_read_only = ON;"
  147. echo "配置完成"
  148. mysql -uroot -pLq123456! -e "SHOW REPLICA STATUS\G" | grep -E "Replica_IO_Running|Replica_SQL_Running"
  149. volumes:
  150. - name: config
  151. configMap:
  152. name: mysql-slave-config
  153. - name: data
  154. persistentVolumeClaim:
  155. claimName: mysql-slave-pvc