通常應用的場所是網站,主的機器是能夠寫能夠讀,從的機器能夠讀,也能夠寫,但不會同步。只有主的機器增刪改,從的機器纔會同步。node
主從至少三個線程:dump、I/O thread、 SQLthreadmysql
binary log:二進制日誌,對於二進制文件的記錄是串行(一條一條)記錄。sql
relay log:中繼日誌數據庫
原理:I/O線程先讀到二進制日誌(Binary log),而後dump線程給I/O線程返回,返回後寫入到中繼日誌(Relay log),然後SQL線程進行讀取,實現回放。bootstrap
當我只有一臺主的時候,從節點不少,這樣壓力全都集中到了主的身上,這樣對主的性能產生了很大的影響,如何解決???vim
blackhole引擎的特色:不能讀,不能寫。就利用這個特色只存儲二進制文件。後端
延遲有好有壞,當我有大量的數據進入數據時,個人二進制日誌是不能同時完成的,由於它是串行的就是一條一條執行,這樣,主節點就會形成延遲,主節點已經延遲了,那麼從節點在讀取二進制日誌的時候,就更延遲了。centos
好處:在我誤操做的時候,能夠先切斷主從之間的鏈接,然後利用延遲從主節點修改個人誤操做,力挽狂瀾!!!緩存
異步:我給你發一個請求,你無須給我返回請求,我只是給你發送請求,好處是效率高,壞處是安全性低。安全
時時同步:我給你發一個請求,你必須給我返回一個信號,我才進行我下面的事情,好處是安全性高,缺點是效率低。
第一種方案:
MHA 主機高可用,通常佈置在另一臺機器上
經過MHA監控主從狀態。當一個主節點死掉以後,會根據MHA的機制,從後端的從機器裏調出一臺成爲主。
如何監控:經過一個配置文件。
第二種方案:適合增刪改較少的。
互爲主備(主主架構)這種架構會形成數據的不一致。
相互有二進制文件便可。
第三種方案:
galera集羣:一條事物同時提交(時時同步)
主節點:
mysql主從配置 yum配置 [mariadb] name=MariaDB baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1 服務器1: MariaDB01 192.168.24.8 服務器2: MariaDB02 192.168.24.9 操做系統: CentOS7.3 數據庫版本: MariaDB-10.3.7 主從關係: MariaDB01爲主,MariaDB02爲從 MariaDB01 1. 修改配置文件 vi /etc/my.cnf.d/server.cnf 在[mysqld]下加入如下 server-id=1 log-bin=mysql-bin 2. 重啓mysql服務 service mysqld restart 3.建立主從鏈接賬號與受權 CREATE USER 'slave'@'%' IDENTIFIED BY 'slave'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; flush privileges; 4.show master status
從節點:
MariaDB02 1. 修改配置文件 vi /etc/my.cnf.d/server.cnf server-id=2
2. 重啓mysql服務 service mysqld restart 3.登陸數據庫 mysql -uroot -proot4. 創建主從鏈接 CHANGE MASTER TO MASTER_HOST='192.168.24.8', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1443; start slave; 5.驗證!!! create database test01 use test01 create table students(id int(10), name char(20), age int(10)) 以後查看從節點是否有test01數據庫和students表 6.查看mysql二進制log mysqlbinlog /var/lib/mysql/mysql-bin.000001 #若是出現不一樣步能夠執行如下步驟 stop slave set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave 或者 stop slave; mysql> change master to master_host='192.168.24.8', master_user='user', master_password='pwd', master_port=3306, master_log_file='mysql-bin.000008', master_log_pos=483; start slave
show slave status\G 這是用豎列的方式查看這兩個線程有沒有啓動
多主的概念:哪一個都是老大
對於一條事物,同時提交,幾乎無延遲。缺點性能會降低。缺點是必須得保證機器硬件的一致。不了會影響效率。
如何實現同步?
經過wsrep協議進行同步。端口號爲4567
第一步:設置主機名host解析,三臺節點都要設置,能互相解析到ip加主機名。
vim /etc/host
ip node1
ip node2
ip node3
第二步:關閉三臺機器的mariadb
第三步:打開mariadb配置文件
vim /etc/my.cnf.d/server.cnf wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so #galera的庫文件的地址 wsrep_cluster_address="gcomm://ip1,ip2,ip3" #各節點的ip wsrep_node_name=node1 #節點主機名 wsrep_node_address=本機ip #本機節點ip binlog_format=row #二進制日誌設置爲行模式 row模式 行模式是安全性最高的,但性能是最低的 語句模式 折中模式 default_storage_engine=InnoDB #使用的默認引擎 innodb_autoinc_lock_mode=2 #性能最好 wsrep_slave_threads=1 #並行複製線程數 innodb_flush_log_at_trx_commit=0 #0.log buffer(緩存)將每秒一次地寫入log file中,而且log file的flush(刷到磁盤)操做同時進行。該模式下在事務提交的時候,不會主動觸發寫入磁盤的操做。 #1:每次事務提交時MySQL都會把log buffer的數據寫入log file,而且flush(刷到磁盤)中去,該模式爲系統默認。 #2:每次事務提交時MySQL都會把log buffer的數據寫入log file,可是flush(刷到磁盤)操做並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操做 innodb_buffer_pool_size=120M #設置緩存池大小 wsrep_sst_method=rsync #遠程同步 wsrep_causal_reads=ON #避免各個節點的數據不一致,這種狀況須要等待全同步複製 將此文件複製到mariadb-2、mariadb-3,注意要把 wsrep_node_name 和 wsrep_node_address 改爲相應節點的 hostname 和 ip。
第四步:啓動集羣服務
啓動 MariaDB Galera Cluster 服務: 第一次啓動要用初始化:mysqld_safe --wsrep_cluster_address=gcomm://ip1,ip2,ip3 >/dev/null & /bin/galera_new_cluster 若是galera_new_cluster 報錯 vim /var/lib/mysql/grastate.dat 把safe_to_bootstrap更改成1 # GALERA saved state version: 2.1 uuid: a393feef-f639-11e8-9b89-4e75f9b8fb0f seqno: -1 safe_to_bootstrap: 1
第五步:查看端口4567和3306是否啓動,把其他節點的mariadb啓動,開始測試glare集羣是否搭建成功。
show status like "wsrep_ready"; 查看glarea是否啓動 show status like "wsrep_cluster_size"; 目前集羣機器數 show status like "wsrep%"; 查看集羣狀態 show status like "wsrep_incoming_addresses"; 查看連接的主機ip