zoukankan      html  css  js  c++  java
  • centos MariaDB10.1.X galera cluster

    [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 选项,是为了安全考虑的。
    
  • 相关阅读:
    Go 解析JSON
    查看端口占用并结束进程
    DNS
    u盘禁用
    主机规划与磁盘分区
    响应式设计初识
    SVG基础
    BootStrap入门
    python中 "is"和"=="的区别
    关于C++模板不能分离编译的问题思考
  • 原文地址:https://www.cnblogs.com/shiyiwen/p/5446755.html
Copyright © 2011-2022 走看看