1. 程式人生 > >centos6.5 MySQL5.7 多主一叢 同步資料 --------同步的資料不再同一個資料庫是分開的

centos6.5 MySQL5.7 多主一叢 同步資料 --------同步的資料不再同一個資料庫是分開的

                    宣告:在做的時候出現的錯誤請檢視百度,解決,大體思路是這樣的

                   從機上建立兩個MySQL5.7資料庫例項,主機A 和主機B 分別同步到從機A例項庫和從機B例項庫,同步的資料不再同一個資料庫


#### 業務場景:

公司幾個主要的業務已經獨立,放在不同的資料庫伺服器上面,但是有一個業務又需要關聯多個業務庫進行聯合查詢統計。這時候就需要將不同的業務庫資料同步到一臺從庫進行統計。根據Mysql主從同步原理使用多從一主的方案解決。主庫使用innodb引擎,從庫開啟多例項使用myisam引擎並將多個例項的資料同步到同一個目錄,並通過flush tables 在一個例項裡面訪問其他例項的資料。


#### 解決思路:

1、主資料庫使用Innodb引擎,並設定sql_mode為 NO_AUTO_CREATE_USER

2、從庫開啟多例項,將多個主庫裡面的資料通過主從複製同步到同一個資料目錄。從庫的每個例項對應一個主庫。多個例項使用同一個資料目錄。

3、從庫使用Myisam引擎,關閉從庫預設的innodb引擎,Myisam引擎可以訪問同一個資料目錄裡面其他例項的表。

4、從庫的每個例項需要執行flush tables 才能看到其他例項表的資料變化,可以設定crontab任務計劃每分鐘在第一個例項重新整理表,以便程式連線的預設例項能看到表的實時變化。

5、設定主庫和從庫的sql_mode都為NO_AUTO_CREATE_USER,只有這樣主庫的innodb引擎的sql同步到從庫的時候才能執行成功。


#### 方案架構圖:

wKiom1ZxRajz4Wx8AAD1fu4_wBA031.png

#### 環境說明:

主庫-1:192.168.1.1

主庫-2:192.168.1.2

從庫-3:192.168.1.3

從庫-3:192.168.1.4

從庫-3:192.168.1.5



#### 實現步驟:(Mysql安裝步驟這裡不在描述)

1、主資料庫配置檔案,多個主庫配置檔案除了server-id不能一樣其他都一樣。(下面的配置需要開發者把基本配置配置好後其他的配置需要一個一個新增,遇到新增進配置後啟動不來mysql需要註釋掉#,天下沒有不勞而獲的午餐......)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 [[email protected] ~] #cat /etc/my.cnf [client] port= 3306 socket=  /tmp/mysql .sock [mysqld] port = 3306 basedir =  /usr/local/mysql datadir =  /data/mysql character- set -server = utf8mb4 default-storage-engine  = InnoDB socket =  /tmp/mysql .sock skip-name-resolv = 1 open_files_limit = 65535  back_log = 103 max_connections = 512 max_connect_errors = 100000 table_open_cache = 2048 tmp-table-size   = 32M max-heap-table-size = 32M #query-cache-type  = 0 query-cache-size  = 0 external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 2M join_buffer_size = 2M thread_cache_size = 51 query_cache_size = 32M tmp_table_size = 96M max_heap_table_size = 96M query_cache_type=1 log-error= /data/logs/mysqld .log slow_query_log = 1 slow_query_log_file =  /data/logs/slow .log long_query_time = 0.1 # BINARY LOGGING # server- id  = 1 log-bin          =  /data/binlog/mysql-bin log-bin-index    = /data/binlog/mysql-bin .index expire-logs-days = 14 sync_binlog = 1 binlog_cache_size = 4M max_binlog_cache_size = 8M max_binlog_size = 1024M log_slave_updates #binlog_format = row  binlog_format = MIXED    // 這裡使用的混合模式複製 relay_log_recovery = 1 #不需要同步的表 replicate-wild-ignore-table=mydb.sp_counter #不需要同步的庫 replicate-ignore-db = mysql,information_schema,performance_schema key_buffer_size = 32M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 myisam_recover transaction_isolation = REPEATABLE-READ innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 5734M innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_data_file_path = ibdata1:1024M:autoextend innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 32M innodb_log_file_size = 2G innodb_log_files_in_group = 2 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_max_dirty_pages_pct = 50 innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda innodb_lock_wait_timeout = 10 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_file_per_table = 1 innodb_locks_unsafe_for_binlog = 0 [mysqldump] quick max_allowed_packet = 32M

2、從庫配置檔案。多個從庫配置檔案除了server-id不能一樣其他都一樣。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 [[email protected] ~]# cat /etc/my.cnf [client] port= 3306 socket= /tmp/mysql.sock [mysqld_multi] # 指定相關命令的路徑 mysqld     =  /usr/local/mysql/bin/mysqld_safe mysqladmin =  /usr/local/mysql/bin/mysqladmin ##複製主庫1的資料## [mysqld2] port = 3306 basedir = /usr/local/mysql datadir = /data/mysql character-set-server = utf8mb4 #指定例項1的sock檔案和pid檔案 socket = /tmp/mysql.sock pid-file=/data/mysql/mysql.pid skip-name-resolv = 1 open_files_limit = 65535  back_log = 103 max_connections = 512 max_connect_errors = 100000 table_open_cache = 2048 tmp-table-size   = 32M max-heap-table-size = 32M query-cache-size  = 0 external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 2M join_buffer_size = 2M thread_cache_size = 51 query_cache_size = 32M tmp_table_size = 96M max_heap_table_size = 96M query_cache_type=1 #指定第一個例項的錯誤日誌和慢查詢日誌路徑 log-error=/data/logs/mysqld.log slow_query_log = 1 slow_query_log_file = /data/logs/slow.log long_query_time = 0.1 # BINARY LOGGING# # 指定例項1的binlog和relaylog路徑為/data/binlog目錄 # 每個從庫和每個例項的server_id不能一樣。 server-id = 2 log-bin          = /data/binlog/mysql-bin log-bin-index    =/data/binlog/mysql-bin.index relay_log = /data/binlog/mysql-relay-bin relay_log_index = /data/binlog/mysql-relay.index master-info-file = /data/mysql/master.info relay_log_info_file = /data/mysql/relay-log.info read_only = 1 expire-logs-days = 14 sync_binlog = 1 #需要同步的庫,如果不設定,默認同步所有庫。 #replicate- do -db = xxx #不需要同步的表 replicate-wild-ignore-table=mydb.sp_counter #不需要同步的庫 replicate-ignore-db = mysql,information_schema,performance_schema binlog_cache_size = 4M max_binlog_cache_size = 8M max_binlog_size = 1024M log_slave_updates =1 #binlog_format = row  binlog_format = MIXED relay_log_recovery = 1 key_buffer_size = 32M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 myisam_recover #設定預設引擎為Myisam,下面這些引數一定要加上。 default -storage-engine=MyISAM default -tmp-storage-engine=MYISAM #關閉innodb引擎 skip-innodb innodb = OFF disable-innodb #設定sql_mode模式為NO_AUTO_CREATE_USER sql_mode = NO_AUTO_CREATE_USER #關閉innodb引擎 loose-skip-innodb loose-innodb-trx=0  loose-innodb-locks=0  loose-innodb-lock-waits=0  loose-innodb-cmp=0  loose-innodb-cmp-per-index=0 loose-innodb-cmp-per-index-reset=0 loose-innodb-cmp-reset=0  loose-innodb-cmpmem=0  loose-innodb-cmpmem-reset=0  loose-innodb-buffer-page=0  loose-innodb-buffer-page-lru=0  loose-innodb-buffer-pool-stats=0  loose-innodb-metrics=0  loose-innodb-ft- default -stopword=0  loose-innodb-ft-inserted=0  loose-innodb-ft-deleted=0  loose-innodb-ft-being-deleted=0  loose-innodb-ft-config=0  loose-innodb-ft-index-cache=0  loose-innodb-ft-index-table=0  loose-innodb-sys-tables=0  loose-innodb-sys-tablestats=0  loose-innodb-sys-indexes=0  loose-innodb-sys-columns=0  loose-innodb-sys-fields=0  loose-innodb-sys-foreign=0  loose-innodb-sys-foreign-cols=0     ##複製主庫2的資料## [mysqld3] port = 3307 basedir = /usr/local/mysql datadir = /data/mysql character-set-server = utf8mb4 #指定例項2的sock檔案和pid檔案 socket = /tmp/mysql3.sock pid-file=/data/mysql/mysql3.pid skip-name-resolv = 1 open_files_limit = 65535  back_log = 103 max_connections = 512 max_connect_errors = 100000 table_open_cache = 2048 tmp-table-size   = 32M max-heap-table-size = 32M query-cache-size  = 0 external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 2M join_buffer_size = 2M thread_cache_size = 51 query_cache_size = 32M tmp_table_size = 96M max_heap_table_size = 96M query_cache_type=1 log-error=/data/logs/mysqld3.log slow_query_log = 1 slow_query_log_file = /data/logs/slow3.log long_query_time = 0.1 # BINARY LOGGING # # 這裡一定要注意,不能把兩個例項的binlog和relaylog放到同一個目錄, # 這裡指定例項2的binlog日誌為/data/binlog2目錄 # 每個從庫和每個例項的server_id不能一樣。 server-id = 22 log-bin          = /data/binlog2/mysql-bin log-bin-index    =/data/binlog2/mysql-bin.index relay_log = /data/binlog2/mysql-relay-bin relay_log_index = /data/binlog2/mysql-relay.index master-info-file = /data/mysql/master3.info relay_log_info_file = /data/mysql/relay-log3.info read_only = 1 expire-logs-days = 14 sync_binlog = 1 #不需要複製的庫 replicate-ignore-db = mysql,information_schema,performance_schema