[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
server-id = 1
log-bin = mysql-binlog
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
binlog_format=ROW
character-set-server=utf8
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#连接有效时长,默认是28800(8小时)
wait_timeout=28800
#表示表名是否大小写敏感,0-敏感;1-不敏感
lower_case_table_names=1
# 建议禁用符号链接,防止各类安全风险
symbolic-links=0
# 127.0.0.1 可以绑定ip地址或者仅允许本地访问,默认情况下我们只接受来自主机的连接
#bind-address = 0.0.0.0
# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64
table_open_cache = 128
# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K
binlog_cache_size = 1M
# 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变
max_heap_table_size = 8M
# MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。
tmp_table_size = 16M
# MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
# 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能
#read_buffer_size = 2M
# MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,
# MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大
read_rnd_buffer_size = 8M
# MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。
# 如果不能,可以尝试增加sort_buffer_size变量的大小
sort_buffer_size = 8M
# 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享
join_buffer_size = 8M
# 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,
# 如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,
# 增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值)
# 根据物理内存设置规则如下:
# 1G —> 8
# 2G —> 16
# 3G —> 32
# 大于3G —> 64
thread_cache_size = 8
# MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,
# 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。
# 通过检查状态值'Qcache_%',可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,
# 如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,
# 这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲
query_cache_size = 64M
# 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,
# 系统将开始换页并且真的变慢了。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过检查状态值Key_read_requests和Key_reads,
# 可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,
# 至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE 'key_read%'获得)。注意:该参数值设置的过大反而会是服务器整体效率降低
#key_buffer_size = 4M
# 超过30天的binlog删除
expire_logs_days = 1
max_connections=2000
# 慢查询时间 超过1秒则为慢查询
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300
innodb_open_files = 500
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM.
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 64M
# 使用5.7支持orderby 和去重同时存在,应该尽量避免这种设计
# sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。
# 主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件(REDO LOG)中。不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1
# 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。
# 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。
# 每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘
# 默认值1是为了保证完整的ACID。当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。
# 设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。
# 总结
# 设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能
innodb_flush_log_at_trx_commit = 0
# 此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间
innodb_log_buffer_size = 2M
query_cache_type=2
# 服务器发送和接受的最大包长度
max_allowed_packet=64M
# MySQL支持4种事务隔离级别,他们分别是:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
# 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED
transaction_isolation = REPEATABLE-READ
# 强制InnoDB恢复,该选项通常只在存在数据文件异常需要强制恢复时开户
#innodb_force_recovery = 1
# 关闭默认更新时间字段
explicit_defaults_for_timestamp=true
# 设置北京时区
#default-time_zone = '+8:00'
#!/bin/bash
pod_seq=`echo $POD_NAME |awk -F"-" '{print $NF}'`
id=$((pod_seq+1))
sed -ri "/server/c server-id = $id" /etc/mysql/my.cnf
在StatefulSet模式下,pod的地址是{{metadata.name}}.{{SERVICE_NAME}}.{{NAMESPACE}}.svc.cluster.local,其中metadata.name=创建的name+“-”+第几个(从0开始),在集群中默认第一个作为master节点,其他作为slave节点。
执行init方法,首先会判断mysql是否启动,不是就kill掉等kubernetes再次创建,如果是,判断pod的name,截取出是第几个,如果是0,那么这个节点将作为master节点,将创建一个用户用来同步数据,首先会判断一下是否存在用户,不存在就创建。其他节点从master节点同步数据,通过ping命令来获取master节点在集群内分配的IP(我在测试的时候发现如果用{{metadata.name}}.{{SERVICE_NAME}}.{{NAMESPACE}}.svc.cluster.local的方式去,Slave_IO_Running一直是connecting状态);首先判断一下slave status,如果 Slave_IO_Running: Yes,Slave_SQL_Running: Yes,Seconds_Behind_Master < 30,就认为slave是没问题的,不然将先停掉slave,再启动
#!/bin/bash
function init(){
if mysqladmin ping -uroot -p$MYSQL_ROOT_PASSWORD; then
pod_seq=`echo $POD_NAME |awk -F"-" '{print $NF}'`
if [ $pod_seq -eq 0 ] ; then
EXISTS=$(mysql -uroot -p$MYSQL_ROOT_PASSWORD -sN -e "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user='$REPLIC_USER')");
if [ $EXISTS -eq 0 ]; then
create_slave_user;
echo "创建用户 $REPLIC_USER";
else
echo "存在用户 $REPLIC_USER";
fi
else
list=(`mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "show slave status \G"|egrep "Running|Behind"|awk -F: '{print $2}'`)
if [ ${list[0]} = "Yes" -a ${list[1]} = "Yes" -a ${list[2]} -lt 30 ]; then
echo "mysql slave 复制正常";
else
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "stop slave";
create_slave;
fi
fi
else
pod_seq=`echo $POD_NAME |awk -F"-" '{print $NF}'`
if [ $pod_seq -eq 0 ] ; then
echo "$(date): MySQL is down!" >> /var/log/mysql_status.log
else
mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD shutdown
fi
fi
}
function create_slave_user(){
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "grant replication slave on *.* to '$REPLIC_USER'@'%' identified by '$REPLIC_PASSWORD';FLUSH PRIVILEGES";
}
function create_slave(){
pod_name=`echo $POD_NAME| awk '{print substr($0, 1, length($0)-2)}'`;
master_host=$(ping -c 1 $pod_name-0.$SERVICE_NAME.$NAMESPACE.svc.cluster.local | awk '/PING/{print $3}'| sed 's/[(:)]//g');
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "change master to master_host='$master_host',master_user='$REPLIC_USER',master_password='$REPLIC_PASSWORD',master_auto_position=1;start slave";
}
function create_mysql_cluster(){
while true
do
init;
sleep 3;
done
}
init;
FROM mysql:5.7.36
COPY ping /bin
COPY my.cnf init.sh my.sh /etc/mysql
docker build -t harbor.service.me:4080/database/mysql-cluster:5.7.36 .
docker push harbor.service.me:4080/database/mysql-cluster:5.7.36
通过postStart在容器启动前修改server-id
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
k8s.kuboard.cn/workload: mysql-cluster
labels:
k8s.kuboard.cn/name: mysql-cluster
name: mysql-cluster
namespace: database
spec:
replicas: 2
selector:
matchLabels:
k8s.kuboard.cn/name: mysql-cluster
serviceName: mysql-cluster
template:
metadata:
labels:
k8s.kuboard.cn/name: mysql-cluster
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: SERVICE_NAME
value: mysql-cluster
- name: REPLIC_USER
value: salve
- name: REPLIC_PASSWORD
value: '123456'
- name: NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: 'harbor.service.me:4080/database/mysql-cluster:5.7.36'
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- bash
- /etc/mysql/my.sh
livenessProbe:
exec:
command:
- bash
- /etc/mysql/init.sh
failureThreshold: 3
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: mysql
readinessProbe:
exec:
command:
- bash
- /etc/mysql/init.sh
failureThreshold: 3
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources: {}
---
apiVersion: v1
kind: Service
metadata:
annotations:
k8s.kuboard.cn/workload: mysql-cluster
labels:
k8s.kuboard.cn/name: mysql-cluster
name: mysql-cluster
namespace: database
spec:
clusterIP: None
ports:
- name: wgfb8m
port: 3306
protocol: TCP
targetPort: 3306
selector:
k8s.kuboard.cn/name: mysql-cluster
sessionAffinity: None
type: ClusterIP
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。