Mysql-DBA高级技术

mysql-DBA之路

Mysql的体系架构

  • mysql是一个单进程多线程的架构
    优势对上下文切换代价比较小Cpu消耗比较小,而oralce的多进程则并发好一些
    
  • 存储引擎为处理:CRUD(读写执行删除)
  • 存储引擎的对象:表

Mysql数据库与实例的关系?

1.什么是MVCC?有什么作用?

MVCC(Multi-Version Concurrent Control),多版本并发控制协议。
在数据库中存在的一个问题:加入有多个用户同时读写数据库里的一行记录,那么怎么保证数据库的一致性?常用的解决办法是通过加锁,把不同的用户分开,某一个时刻上只允许某个用户执行读写操作,对同一行记录的读写操作完全的串行化执行,因此不存在一致性问题,但是存在明显的性能问题:读会堵塞写,写也堵塞读,整个数据库的并发性能很差。

MVCC协议的使用,在保证数据库性能一致的前提下,提供一种高并发的访问能力。每一个用户在连接数据库的时候看见的是一个高度一致性状态的镜像,每个事务在提交到数据库之前对其他的用户均为不可见的。每当事务需要更新数据时,不会直接覆盖以前的数据,而是生成一个新的版本的数据,因此一条数据会有多个版本的数据存储,但是在同一个时刻只有最新的版本号才是有效的用户看见的,这样可以保证总是以当前的时刻的版本数据能被读到,不论这条数据是否被修改或删除。

2.ACID中的I是怎么实现在的?

ADID中的I(隔离)—【原子性、一致性、隔离、耐久性】

在数据库中,隔离确定了用户和系统对事物完整性的可视性

Mysql-标准化、自动化部署

机器标准化

现在市面上公司主流购买的服务器:

  • Dell-R630-1U、Dell-R730-2U、Dell-R930-4U
  • 华为FusionServer系列

多实例部署

  • 实例=进程+内存(实例通过端口来区别)

简单的在centos-7下编译mysql-5.6

  • 1.关闭防火墙
  • 2.配置sysctl.conf
  • 3.检查操作系统是否安装了mysql
  • 4.下载myql源码包
  • 5.添加用户和组
  • 6.配置mysql环境变量
  • 7.创建目录及其授权
  • 8.编译安装
  • 9.mysql参数配置
  • 10.初始化mysql脚本
  • 11.启动登入mysql

实际操作步骤之环境检查:

iptables -F
iptables -X 
setenforce 0
rpm -qa | grep mysql  # 存在则删除 rpm -e xxxx

安装前环境的部署:

yum install -y  cmake gcc gcc-c++ ncurses-devel bison zlib libxml openssl bison-devel
yum install –y openssl openssl-devel ncurses ncurses-devel cmake bison-devel ncurses-devel openssl-devel bison ncurses autoconf
mkdir -pv /mysql/my3306/{data,log,run,tmp}
mkdir -pv /mysql/my3306/log/{binlog,iblog}
groupadd mysql
useradd -m mysql -d /home/mysql -g mysql
passwd mysql
su - mysql

设置环境变量:

vim .bash_profile
    PATH=PATH:HOME/.local/bin:HOME/bin     PATH=PATH:$HOME/bin:/mysql/my3306/bin

上传编译:

source .bash_profile
rz mysql-5.6.tart.gz
tar -xzf mysql-5.6.tart.gz
cd mysql-5.6
------------------------编译安装------------------------
cmake \
-DCMAKE_INSTALL_PREFIX=/mysql/my3306 \
-DINSTALL_DATADIR=/mysql/my3306/data  \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_SSL=yes \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/mysql/my3306/run/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DSYSCONFDIR=/etc \
-DWITH_READLINE=on
make -j 4 && make install 
-------------------------配置初始化------------------------
cd /mysql/my3306
rz my.cnf
./scripts/mysql_install_db --defaults-file=/mysql/my3306/my.cnf --datadir=/mysql/my3306/data -user=mysql   # 初始化启动脚本
cd /mysql/my3306/bin 
./mysqld_safe --defaults-file=/mysql/my3306/my.cnf --user=mysql &   # 后台启动即便KILL了mysql进程也会自动启动

如果Cmake报错:

需要升级一下Cmake的版本
rz cmake && tar -xzf cmake && cd cmake
./bootstrap && make -j$(getconf _NPROCESSORS_ONLN) && make install

Mysql-Cluster官方地址

Mysql cluster的下载地址:https://dev.mysql.com/downloads/cluster/

mysq-cluster架构规划拓扑图

Mysql-Cluster部署及其环境初始化

1.环境初始化:

sed -i "7s/enforcing/disabled/g" /etc/selinux/config
完全删除mysql相关文件如:init、my.cnf、mysql组件等
配置hots文件:
    192.168.175.210  mysql-cluster-master
    192.168.175.211  mysql-cluster-sql-1
    192.168.175.212  mysql-cluster-sql-2
    192.168.175.218  mysql-cluster-ndb-1
    192.168.175.219  mysql-cluster-ndb-2
<并且scp到所有主机上>

2.yum配置安装:

上传epel源和 mysql-yum
rz epel-yum mysql-yum
yum -y install xxxx
yum makecache && yum claen all && yum list 
sed -i "55s/0/1g" /etc/yum.repo.d/mysql-community.repo
yum install -y perl perl-Class-MethodMaker perl-DBI  libaio numactl mysql-cluster-community-server  # 安装解决cluster依赖

3.(ndb)数据节点主机安装相关组件:

yum install -y mysql-cluster-community-data-node  

4.管理节点上安装相关组件:

yum -y install mysql-cluster-community-management-server  # 管理节点上安装
mkdir -pv /usr/mysql-cluster

5.配置mysql-cluster文件:

vim /usr/mysql-cluster/config.ini
    [ndbd default]
    NoOfReplicas=2                                # 数据写入数量。2表示两份  
    DataMemory=200M                               # 配置数据存储可使用的内存,经验值:系统的4/3
    IndexMemory=100M                              # 索引给100M
    [ndb_mgmd]
    nodeid=1
    datadir=/var/lib/mysql                        # 管理结点的日志
    HostName=
    ###### data node options:                     # 存储结点
    [ndbd]
    HostName=                                     #管理节点IP
    DataDir=/var/lib/mysql                        # mysql数据存储路径   
    nodeid=2
    [ndbd]
    HostName=
    DataDir=/var/lib/mysql                        # mysql数据存储路径    
    nodeid=3
    # SQL node options:                           # 关于SQL结点
    [mysqld]
    HostName=
    nodeid=4
    [mysqld]
    HostName=
    nodeid=5

6.配置my.cnf文件:

mv /etc/my.cnf /etc/my.cnf.back   # 备份源文件
vim /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql                  # mysql数据库存储路径
    ndbcluster                              # 启动ndb引擎
    ndb-connectstring=192.168.175.210       # 管理节点IP地址

    [mysqld_safe]                           # 安全启动的配置项
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid

    [mysql_cluster]
    ndb-connectstring=192.168.175.210       # 管理节点IP地址

# 除了管理节点不需要要其他的节点都要更改,sql节点不需要存储数据所以datadir=/xxx/xxx/xx  删除

7.Mysql Cluster的启动:

初次启动命令以及用户密码更改调整:(必须要严格按照次序启动)
先启动:管理节点服务 -> 数据节点服务 -> sql节点服务
关闭: 关闭管理节点服务 -> 关闭管理节点后,数据节点服务会自动的关闭 -> 需要手动的把sql节点关闭了
执行的初次启动前需要确认两台机器的防火墙是否关闭,若开启则放行1186(通讯接口)、3306(数据端口)

1.管理节点的启动:
    ndb_mgmd --ndb-nodeid=1 --initial -f /usr/mysql-cluster/config.ini
2.登入管理节点:
    ndb_mgm
    ndb_mgm> show
    -------------------------展示现在存活的节点------------------------
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)] 2 node(s)
    id=2 (not connected, accepting connect from mysql-cluster-ndb-1)
    id=3 (not connected, accepting connect from mysql-cluster-ndb-2)

    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @192.168.175.210  (mysql-5.7.20 ndb-7.5.8)  # 目前只存活管理节点

    [mysqld(API)]   2 node(s)
    id=4 (not connected, accepting connect from mysql-cluster-sql-1)
    id=5 (not connected, accepting connect from mysql-cluster-sql-2)
    ndb_mgm> 
    -------------------------------------------------------------------
3.启动数据节点:
    ndbd --initial  
    -------------------------------启动成功------------------------------------------------
    2017-12-21 16:10:40 [ndbd] INFO     -- Angel connected to 'mysql-cluster-master:1186'
    2017-12-21 16:10:40 [ndbd] INFO     -- Angel allocated nodeid: 2
    ---------------------------------------------------------------------------------------
4.启动sql节点:
    systemctl start mysqld
    grep password /var/log/messages   # 初始化的密码
    mysql -uroot -p"password"   # 加入""的目的是有特殊字符存在
    set password for root@localhost =password('123456');  # 设置新的mysql密码
    grant all privileges on *.* to cluster@'%' identified by '123456';   # 创建集群用户 
    flush privileges;   # 刷新权限
    select distinct concat('User:''',user,'''@''',host,''';')as query from mysql.user;     #查询当前数据库的用户及其拥有的权限
    如果报错:
    -----------------------------------------------------------------------------------
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    -----------------------------------------------------------------------------------
    则:
    set global validate_password_policy=0;   # 政策定义
    set global validate_password_length=1;   # 定义默认长度(系统默认是八位)

Mysql集群实现高可用

Mysql cluster 概述:

Mysql-Cluster是Mysql适用分布式计算环境的高实用、高冗余版本.它采用了NDB Cluster存储引擎,允许在一个Cluster中运行多个Mysql服务器。

Mysql Cluster是一种技术,该技术允许在无共享的系统中部署(内存中)数据库的Cluster,通过无共享体系结构,系统能够使用廉价的硬件,而且对于软硬件无特殊要求。此外,由于每个组件都有自己的内存和磁盘,不存在单点的故障问题。

  • 集群架构拓扑图

<SQL节点>:给上层应用提供sql访问。

<管理节点(MGM)>:管理整个集群,启动和关闭。通过ndb_mgmd,命令启动集群。

<存储/数据节点>:保存cluster中的数据,数据节点,可以提供副本,实现数据的冗余。

<NDB引擎>:是一种"内存中"的存储引擎,它具有可用性高的数据一致性特点。

NDB引擎:Mysql Cluster使用了一个专用于基于内存的存储引擎-NDB引擎,这样做的好处是速度快,没有磁盘I/O的瓶颈,但是由于是内存中的,所以数据的规模收到比较大的影响,受系统总内存的限制,如果运行NDB的Mysql服务器必须保证内存足够大,且NDB引擎是分布式的,它可以配置在多台的服务器上来实现数据的可靠性和扩展性,理论上来说,通过配置两台的NDB存储节点就能够实现这个数据库集群的冗余和解决点单故障的问题。

优缺点的概述:

缺点:

  • 基于内存,数据库的规模受到集群总内存的大小限制。
  • 基于内存,断电后数据可能会丢失。(尚不明确)
  • 多个节点通过网络实现通讯和数据的同步、查询等功能,因此整体性受到网络速度的制约,速度可能比较慢。

优点:

  • 多个节点之间可以分布在不同的地理位置,因此也是实现一个分布式的数据库的方案。
  • 扩展性好,增加节点即可实现数据库的集群扩展。
  • 冗余性很好,多个节点上都是完整的数据库数据,因此任何一个节点宕机都不会造成服务的终止。

Mysql高可用集群架构-MHA架构

简介:

MHA(Master High Availability)目前在Mysql高可用方面是一个相对成熟的解决方案,它由日本DeNA公司Youshimaton开发,是一套优秀的Mysql高可用性环境下故障切换和主从提升的高可用软件,在Mysql故障切换中,MHA能够做到在0-30秒之内自动切换完成数据库的故障切换,并且在进行故障切换的过程中,能够再最大程度上保证数据的一致性,以达到真正意义上的高可用。

该软件由两部分组成:MHA Manganaer(管理节点)和MHA Node(数据节点)MHA Manager可以单独部署在一台独立的机器上管理多个Master-slave集群,也可以部署在一台slave节点上,MHA Node运行在每台Mysql服务器上,MHA Manger会定时的探测集群中的Master节点,当Master出现故障的时候,它可以自动化将最新的数据的slave提升为slave新的master,然后将所有的其他的slave重新指向Master.整个故障转移过程对于应用程序完全的透明化。

在MHA自动故障切换过程中,MHA视图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这个并不总是可行的。

例如:如果主服务器硬件故障或无法通过SSH访问,MHA没法保存二进制文件,只进行故障转移而丢失了最新的数据,所以使用Mysql5.5的版同步复制,可以大大降低数据丢失的风险。MHA可以与版同步复制结合起来,如果只有一个Slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的Slave服务器上,因此可以保证所有的节点的数据一致性!

Mysql的调优

1.调优思路

  • 数据库设计与规划 –(核心:采用数据量,使用什么存储引擎)
  • 数据的应用 –(怎样取出数据,sql语句的优化)
  • 磁盘的I/O优化
  • 操作系统的优化 –(内核、tcp连接数量)
  • mysql服务优化 –(内存的使用、磁盘的使用)
  • my.cnf –(内参数的优化)
  • 分库表思路和优劣

2.硬件优化

  • CPU -> 64位、高主频、高缓存、高并发处理能力
  • 内存 -> 大内存、高主频、重点是最好不用swap分区
  • 硬盘 -> 15000转、RAID5、RAID10、SSD固态硬盘
  • 网络 -> 标配前兆网卡、10G网卡、bond0、mysql服务器尽可能和使用它的web服务器在同一局域网内、尽量避免诸如防火墙策略等不必要的开销。

3.数据库设计与规划(架构上的优化)

  • 纵向拆解:专机专用

解释 -> 某公司一台服务器同时负责 web tftp 数据库等多角色

  • 横向拆解

解释 -> 主从同步、负载均衡、高可用性集群、当单个mysql数据库无法满足日益增加的数据需求时候,可以考虑在数据库这个逻辑层面增加更多的服务器,以达到稳定、高效的效果。

4.数据库查询优化

  • 建表时表结构要合理,每个表不宜过大,在任何的情况下均应使用最精确的类型。例如:如果ID列用int是一个好主意,而用text类型是一个蠢办法,time列酌情的使用date或者datetime。
  • 索引,建立合适的索引
  • 查询时尽量的减少逻辑运算(与运算、或运算、大于小于某数值的运算)
  • 减少不当的查询语句,不要查询应用中不要的列,比如说select * from books等操作
  • 减少事务包的大小
  • 将多个小的查询适当的合并成一个大的查询,减少每次建立/关闭查询时候的开销
  • 将某些过于复杂的查询拆解成多个小查询
  • 建立和优化存储过程来代替大量的外部程序的交互

5.磁盘I/O规划

  • riad技术:raid0或raid10
  • ssd: 15000转、raid5、raid10
  • swap分区:最好使用raid0、ssd
  • 磁盘分区:将数据库目录放到一个分区上或一个磁盘上的物理分区,存储数据的硬盘或分区和系统所在的硬盘分开。

    6.数据配置文件的优化

  • 设置主从时,由于binlog日志频繁记录操作,开销非常大,需要把binlog日志放到其它硬盘上。

vim /etc/my.cnf

datadir=/data/   #存储在独立的硬盘上
socker=/var/mysql/mysql.sock
user=mysql
sysmbolic-links=0   #在原配置文件中,添加以下内容

7.操作系统的优化

  • 网卡 bonding 技术
  • 设置TCP连接数量的限制,优化系统打开文件的最大限制
  • 使用64位操作系统,64位系统可以分给单个进程更多的内存,计算更快
  • 禁用不必要的启动的服务
  • 文件系统调优,给数据仓库一个单独的文件系统,推荐使用XFS,一般效率更高、更可靠
  • ext3不错、etx4只是一个过渡的文件系统
  • 可以考虑在挂载分区的时候启用 noatime 选项不记录访问时间

最小化原则:

  • 安装系统最小化
  • 开启程序服务最小化
  • 操作系统最小化原则
  • 登入最小化
  • 权限最小化

8.Mysql服务优化

*数据库服务的优化

保持每一一个表都不要太大,可以对大表做横切和纵切。例如:

系统要取得某ID的lastlogin,完全可以做一张只有ID和lastlog的小表,而非几十、几百列数据的并排大表
另外对一个有1000万条记录的表做更新对比对10个100万记录的表做更新一般来的要慢

存储引擎:

myisam引擎,表机锁,表级锁开销小,影响范围大,适合读多写少的表,不支持事务。表锁定不存在死锁。
innodb引擎,行级锁,锁定行的开销要比锁定全表要打。影响范围小,适合的写操作比较平凡的数据表,行锁可能存在死锁。
Mysql的锁机制比较简单,其中最显著的特点是不通的存储引擎支持不同的锁机制。

开启后悔将所有的死锁记录到error log中错误日志在my.cnf配置为:

log-error=/var/log/mysqld.log
innodb_print_all_deadlocks=1
innodb_sort_buffer_size=16M

查看数据库服务的状态、登入mysql:

show status;        查看系统状态
show engine innodb status  \G       显示Innodb存储引擎的状态
show variables      查看变量,在my.cnf配置文件里面定义的变量值
show warnings       产看报错信息
show processlist    产看当前数据库在进行的操作

启用Mysql慢查询日志:分析慢查询日志

vim /etc/my.cnf
[mysql]
slow_query_log=1    # 开启慢查询日志
slow-query_log_file=/var/lib/mysql/slow.log    # 该路径对于Mysqly用户拥有可写权限
long_query_time=5   # 设置查询时间超过5秒的语句记录下来
(log_queries-not-using-indexes=1)   # 没有索引的查询记录,可用可不用

前3一起使用可以记录下执行时间超过5秒和没有使用索引的查询,通常在没有特殊设置情况下慢查询日志都保存在。

9.my.cnf内参数优化

  • 优化的原则:给mysql的资源太少,则mysql施展不开,给mysql资源太多,可能会拖累整个OS系统。通常给予40%给系统,60%-70%给mysql(内存及其CPU)

对查询进行缓存:

大多数的Lamp应用都严重依赖于数据库的查询,查询的大致过程为:
PHP发出查询请求 -> 数据库收到指令对查询语句进行分析 -> 确定如何查询 -> 从磁盘中加载信息 -> 返回结果

如果反复查询,就反复执行这些结果Mysql有个一存储机制称为:查询缓存,它可以将查询的结果保存在内存中,在很多的情况下,这会极大地提高性能,但是,问题是查询的缓存在默认的情况下是被禁用的。

启动查询缓存:

vim /etc/my.cnf
[mysql]
query_cache_size = 32M
保存重启下mysql

10.对Mysql的资源优化

  • 对Mysql中强制一些限制来确保系统负载不会导致资源耗尽的情况出现

配置/etc/my.cnf:

[mysql]
max_connections=500     # 上限看硬件的配置
wait_timeout=10
max_connect_errors=100

参数解释:

第一行 -> 最大连接数,在服务器没有崩溃之前确保只建立服务允许数目的连接,该参数设置过小的最明显特征是出现 "Too many connections" 错误
第二行 -> Mysql 将终止等待的时间(空闲时间)超过10秒的连接,在Lamp应用中,连接数据库的时间通常就是Web服务器处理请求锁花费的时间。有时间如果负载过重,连接就会挂起,并且会占用连接表空间。如果有多个交互界面的用户使用到数据库的持久连接,那么应该将这个值设置低一点。
第三行 -> 如果一个主机在连接到服务器时有问题,并且重试很多次后放弃,那么这个主机就会被锁定,直到执行。

11.表的高速缓存

数据库中的每个表存储在一个文件中,要读取的文件的内容,必须先打开文件,然后再读取。为了加快从文件中读取数据的过程,mysql对这些打开文件进行了缓存,其中最大数目的由/etc/my.cnf中的 table_cache 来指定。

12.关键字缓冲区

  • key_buffer_size 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读取的速度

扩展.Mysql优化之——分库分表

  • <1>基本思想之什么是分库分表?

从字面上的意思来看,就是把原子存储在一个库的数据分块存储到多个库上,把原来存储于一个表的数据分块存储到多个表上。

  • <2>基本思想之为什么要分库分表?

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应大,数据操作,增删改查的开销也会越来越大,另外,一台服务器的资源(CPU、磁盘、内存、I/O)都是有限的,最终数据库所能够承载的数据量、数据处理能力都将会遭遇到瓶颈。

  • <3>分库分表的实施策略

如果你的单机性能已经很低了,那可以尝试分库。分库,业务透明,在物理上实现分成多个服务器,不同的分库在不同服务器上。分区可以把表分到不同的硬盘上,但是不能分配到不同的服务器上,一台机器的性是有限制的,用分库可以解决单台服务器性能不足的问题,或者成本过高的问题。

分库分表容易出现的问题

  • <1>事务问题

在执行分库分表之后,由于数据存储到了不同的数据库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能区执行事务,将付出高昂的性能代价,如果由应用程序去协助控制,形成程序逻辑上的事务,又将会造成编程方面的负担。

  • <2>跨库跨表的join问题

在执行了分库分表之后,难以避免的会将原来的逻辑关联性很强的数据划分到不同的表,也就无法join分表粒度不同的表,结果原本是一次查询能够完成的业务,有可能需要多次查询才能完成。

  • <3>额外的数据管理负担和数据运算压力

额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都是可以通过应用程序解决的,单必然会引起额外的逻辑运算,例如:d对于一个记录用户成绩的用户数据表usertable,业务要求查出成绩最好的100位,在进行分表之前,只需要一个order by语句就可以搞定,但是在进行分表之后,将需要N个order by语句,分别查询出每个分表前100名用户数据,然后对这些数据进行合并计算,才能返回得到结果。
###总结:

  • 机器的配置 -> CPU、内存、硬盘
  • Mysql的参数配置
  • Mysql的运行状态
  • Mysql的慢查询
  • 以上问题解决后,再来考察程序方面的问题!

如果不进行域名解析(由此带来的权限问题)。关闭mysql的DNS反查询功能,加快速度。

[mysql]
skip-name-resolve    #禁用DNS解析,就会加快速度很多,但是如果这样在Mysql授权中就不能使用主机名了只能使用IP

##MGR集群未来数据库发展方向
###MGR基础结构要求
1.介绍

MYSQL group Replication (简称MGR)是Mysql官方2016年12月推出的一个群信的高可用与高扩展的解决方案,Mysql组复制提供了高可用、高扩展、高可靠的Mysql集群。

  • 高一致性,基于原声复制及paxos协议的组复制技术,并且以插件的方式提供,提供一致的数据安全保证
  • 高容错性,只要不是大多数的节点损坏就可以继续工作,有自动检测机制,当不同节点昌盛资源争取冲突时候,不会出现的错误,安装先到者优先的原则,内置了自动化脑裂防护机制。
  • 高拓展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他的节点上同步状态,知道新的节点和其他的系诶点那保持一致,如果某节点自动更新组信息,自动维护新的组信息。
  • 高灵活性,有单主模式和多模式,单模式下,会自动选取主,所有的更新操作都是在主上进行,多主模式下,所有server都可以同时处理更新。

###MGR基础结构要求

  • 引擎 -> innodb (必须支持在commit时对各节点进行冲突检查)
  • 每个表必须有主键,在进行事务冲突检测时需要利用主键值做对比
  • 必须开启binlog且为row格式
  • 开启GTID,且主从状态信息存于表中
    --master-info-repository=TABLE
    --relay-log-infp-repository=TABLE
    --log-slave-updates 开启
    --transaction-write-set-extraction=XXHASH64
    

###MGR使用限制

  • RP和普通复制binlg校验不能共存
    需要设置--binlog-checksum=none
    
  • 不支持gap lock(间隙锁),隔离级别需要设置read committed

  • 不支持对表进行锁操作(lock/unlock table),不会发送到其他的节点执行,影响需要对表进行加锁操作的情况下,列入mysqldump全表备份恢复。
  • 不支持serializable(序列化)隔离级别
  • DDL语句不支持原子性,不能检车冲突,执行后需要自行校验是否一致
  • 不支持外键:多主不支持,单主键不存在此问题
  • 最多支持9个节点,超过9台serer无法加入组

###安装配置

Mysql-DBA高级技术》有2个想法

  1. I¡¦ve been exploring for a little for any high-quality articles or weblog posts on this sort of house . Exploring in Yahoo I at last stumbled upon this web site. Reading this information So i am satisfied to convey that I’ve a very just right uncanny feeling I came upon exactly what I needed. I so much indubitably will make sure to don¡¦t overlook this web site and provides it a glance regularly.

发表评论