[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.12/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

 

 

最近在做这方面调优,顺便记录一下。

一、MariaDB Galera Cluster概要:

1.简述:

      MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到 各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。

2.特性:

      (1).同步复制 Synchronous replication

      (2).Active-active multi-master 拓扑逻辑

      (3).可对集群中任一节点进行数据读写

      (4).自动成员控制,故障节点自动从集群中移除

      (5).自动节点加入

      (6).真正并行的复制,基于行级

      (7).直接客户端连接,原生的 MySQL 接口

      (8).每个节点都包含完整的数据副本

      (9).多台数据库中数据同步由 wsrep 接口实现

3.局限性

      (1).目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.

      (2).DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.

      (3).在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…

      (4).查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。

      (5).允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。

      (6).由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

      (7).XA事务不支持,由于在提交上可能回滚。

      (8).整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

      (9).集群节点建议最少3个。

      (10).如果DDL语句有问题将破坏集群。

 

采用快捷的yum方式。

MariaDB.repo

 

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.13/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 

 版本可以参考baseurl 里面的连接,更换数字,以及系统位数

使用yum clearn all 清除缓存

10.1.X 后的版本和之前的不一样。没有Mariadb galera server 这个包。

yum -y install MariaDB-client MariaDB-common MariaDB-devel MariaDB-server MariaDB-shared galera

 自己cmake 也可以。(觉得没必要)

然后更改配置文件(根据自身系统优化过后的)

[server]

[mysqld]
log-error                               = /data/mysql/error.log
skip-name-resolve
skip-host-cache
skip-external-locking

#set client (except root)  
init_connect  =  'SET autocommit  =  0'
init_connect  =  'SET NAMES utf8'
init_connect  =  'SET character_set_client  =  utf8'
init_connect  =  'SET character_set_results  =  utf8'
init_connect  =  'SET character_set_connection  =  utf8'
skip-character-set-client-handshake


#log
#log-bin  =   /data/mysql/mysql_logs/binary_log/dbtest-bin  
#log-bin-index  =   /data/mysql/mysql_logs/binary_log/dbtest-bin.index 
#networking   
wait_timeout                            =  10
max_allowed_packet                      =   64M

max_connections                         = 300
max_connect_errors                      =   6000

event_scheduler                         =   ON

innodb_buffer_pool_instances   =   8
innodb_file_per_table                   = 1         #每张表一个数据文件
innodb_log_files_in_group               = 3
innodb_log_file_size                    = 768M
innodb_log_buffer_size                  =  16M
innodb_data_file_path                   = ibdata1:500M;ibdata2:500M:autoextend
innodb_buffer_pool_size                 = 22G
innodb_flush_log_at_trx_commit          = 2  #可以提高性能,gslera保证不丢数据


innodb_max_dirty_pages_pct              =   90
innodb_thread_concurrency               =   0  #Set to 0 when using the threadpool  
innodb_thread_sleep_delay               =   500
innodb_concurrency_tickets              =   5000
innodb_read_io_threads                  =   8
innodb_write_io_threads                 =   4
#innodb_io_capacity                     =   2000  
innodb_lock_wait_timeout                =   30
innodb_purge_threads                    =   1
innodb_purge_batch_size                 =  300
innodb_open_files                       =   2000
innodb_read_ahead_threshold             =   56

innodb_flush_method                     = O_DIRECT
innodb_use_native_aio                   =   on
innodb_use_sys_malloc                   =   on
innodb_buffer_pool_dump_at_shutdown     =   1
innodb_buffer_pool_dump_now             =   1
innodb_buffer_pool_load_at_startup      =   1
innodb_buffer_pool_load_now             =   1

default-storage-engine=InnoDB
sql-mode                                =  "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
table_open_cache                        =  2000
open_files_limit                        =  65535
sort_buffer_size                        =  2M
thread_cache_size                       =  300
tmp_table_size                          =  128M
key_buffer_size                         =  1024M
read_buffer_size                        =  1M
read_rnd_buffer_size                    =  12M




innodb_buffer_pool_populate             =   1
thread_handling                         = pool-of-threads

binlog_format                           =ROW
bind-address                            =0.0.0.0
datadir                                 =/data/mysql
socket                                  =/data/mysql/mysql.sock

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='galera01'
wsrep_cluster_address="gcomm://node1,node2,node3"
wsrep_node_name=node1
wsrep_node_address=172.16.38.172
wsrep_on=ON
default_storage_engine=InnoDB
wsrep_sst_method=rsync
wsrep_sst_auth=sst_user:dbpass

 不一一解释了,当时用tpcc-mysql调优的参数。

启动第一个

service mysql start --wsrep-new-cluster

 可能会点点点很长时间,但是我们可以通过日志看到数据库是否已经正常起来。

如果还在点点点,可以不用管,直接crtl+c

第二胎第三台就直接service mysql start 就行了。只要有一台在 就不用刚刚启动第一次的命令。

show status like 'wsrep%';

 来查看集群状态

加上haproxy之后 需要添加允许haproxy 健康检查,和集群之间的互相访问

 grant all privileges on *.* to sst_user@localhost identified by 'dbpass';
insert into mysql.user (host,user) values ('172.16.38.178','haproxy');
grant all privileges on *.* to root@localhost identified by 'anjubao.com';
#如果insert 报错,有可能配置文件 有sql_mod 选项,是为了安全考虑的。