[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 选项,是为了安全考虑的。