MySQL高可用實(shí)現(xiàn):主從結(jié)構(gòu)下ProxySQL中的讀寫分離

原文: http://www.enmotech.com/web/detail/1/714/1.html ( 復(fù)制鏈接,打開瀏覽器即可查看原文 ) 

10年積累的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有海州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

墨墨導(dǎo)讀:ProxySQL是一個(gè)高性能的MySQL中間件,擁有強(qiáng)大的規(guī)則引擎。
ProxySQL提供強(qiáng)大的路由規(guī)則。當(dāng)應(yīng)用程序自身不支持讀寫分離時(shí),DBA可以通過配置路由規(guī)則為應(yīng)用程序提供透明的讀寫分離,使用Keepalived + ProxySQL + Orchestrator為主從提供高可用時(shí),能夠有效的避免keepalived + 雙主結(jié)構(gòu) 由于keepalived腦裂而造成數(shù)據(jù)被寫錯(cuò)亂的痛點(diǎn)。

介紹


ProxySQL是一個(gè)高性能的MySQL中間件,擁有強(qiáng)大的規(guī)則引擎。具有以下特性:

1.為對(duì)多個(gè)數(shù)據(jù)庫的應(yīng)用程序請(qǐng)求提供“智能”的負(fù)載均衡。
2.實(shí)現(xiàn)了MySQL請(qǐng)求協(xié)議,能夠?qū)?yīng)用程序提供透明的讀寫分離,避免了應(yīng)用程序?qū)崿F(xiàn)復(fù)雜的讀寫分離。
3.能夠自動(dòng)感知數(shù)據(jù)庫健康狀態(tài)和拓?fù)浣Y(jié)構(gòu)并且能夠自動(dòng)將應(yīng)用程序請(qǐng)求路由到處于健康狀態(tài)的MySQL實(shí)例。
4.保護(hù)應(yīng)用程序不受底層數(shù)據(jù)庫復(fù)雜拓?fù)浣Y(jié)構(gòu)變化而受影響,能夠自動(dòng)將寫請(qǐng)求轉(zhuǎn)發(fā)的主庫,自動(dòng)按照權(quán)重將讀請(qǐng)求發(fā)送的主庫和從庫。
5.提供了對(duì)查詢SQL的監(jiān)控分析統(tǒng)計(jì)。
6.為管理員提供了強(qiáng)大的控制機(jī)制,可以在代理層緩存查詢,以便更快地響應(yīng)查詢、重新路由查詢,甚至重新改寫那些質(zhì)量較差的查詢語句。

模塊


MySQL高可用實(shí)現(xiàn):主從結(jié)構(gòu)下ProxySQL中的讀寫分離

ProxySQL組成模塊

Qurey Processor 用于匹配查詢規(guī)則并根據(jù)規(guī)則決定是否緩存查詢或者將查詢加入黑名單或者重新路由、重寫查詢或者鏡像查詢到其他hostgroup。
User Auth 為底層后端數(shù)據(jù)庫認(rèn)證提供了用戶憑證。
Hostgroup manager – 負(fù)責(zé)管理發(fā)送SQL請(qǐng)求都后端數(shù)據(jù)庫并跟蹤SQL請(qǐng)求狀態(tài)。
Connection pool – 負(fù)責(zé)管理后端數(shù)據(jù)庫連接,連接池中建立的連接被所有的前端應(yīng)用程序共享。
Monitoring – 負(fù)責(zé)監(jiān)控后端數(shù)據(jù)庫健康狀態(tài)主從復(fù)制延時(shí)并臨時(shí)下線不正常的數(shù)據(jù)庫實(shí)例。

安裝


1.從 https://github.com/sysown/proxysql/releases 下載相應(yīng)的版本。
2.yum localinstall proxysql-1.x.rpm
3.啟動(dòng)ProxySQL

/etc/init.d/proxysql start


配置結(jié)構(gòu)


ProxySQL配置可以存儲(chǔ)到SQLite數(shù)據(jù)庫并通過SQL語句來管理配置,并通過如下三層配置來管理ProxySQL。

DISK: 使用SQLite來持久存儲(chǔ)ProxySQL配置,以防ProxySQL重啟后配置丟失。
Memory: 存在于內(nèi)存中的配置,也是用戶通過SQL直接管理的配置。
Runtime: 當(dāng)前正在使用的配置,處于生效部分。 


MySQL高可用實(shí)現(xiàn):主從結(jié)構(gòu)下ProxySQL中的讀寫分離


使用ProxySQL修改配置時(shí),可以通過SQL語句直接修改Memory中的配置,然后使用load命令將Memory中的配置加載的到runtime層來驗(yàn)證配置是否正確,如果驗(yàn)證通過可以通過save將配置保存到SQLite數(shù)據(jù)庫中,如果驗(yàn)證不通過也可以通過load命令將DISK層中的配置加載到Memory和runtime層中,達(dá)到回滾到效果。


內(nèi)置庫表介紹


登錄到proxysql管理端口,默認(rèn)用戶名密碼為:admin/admin

mysql -uadmin -padmin -h227.0.0.1 -P6032

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.6.30 (ProxySQL Admin Module)

Admin> show databases;

+-----+---------+-------------------------------+

| seq | name   | file                         |

+-----+---------+-------------------------------+

| 0   | main   |                               |

| 2   | disk   | /var/lib/proxysql/proxysql.db |

| 3   | stats   |                               |

| 4   | monitor |                               |

+-----+---------+-------------------------------+

  * main: 數(shù)據(jù)庫里存放后端db實(shí)例、用戶驗(yàn)證、路由規(guī)則等信息。表名以 runtime開頭的表示proxysql當(dāng)前運(yùn)行的配置內(nèi)容,不能通過dml語句修改,只能修改對(duì)應(yīng)的不以 runtime 開頭的(在內(nèi)存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盤以供下次重啟加載。
  * disk 是持久化到硬盤的配置,sqlite數(shù)據(jù)文件。
  * stats 是proxysql運(yùn)行抓取的統(tǒng)計(jì)信息,包括到后端各命令的執(zhí)行次數(shù)、流量、processlist、查詢種類匯總/執(zhí)行時(shí)間,等等。
  * monitor 庫存儲(chǔ) monitor 模塊收集的信息,主要是對(duì)后端db的健康/延遲檢查。

Admin> show tables;
+--------------------------------------+
| tables                               |
+--------------------------------------+
| global_variables                     |
| mysql_collations                     |
| mysql_query_rules                   |
| mysql_replication_hostgroups         |
| mysql_servers                       |
| mysql_users                         |
| runtime_global_variables             |
| runtime_mysql_query_rules           |
| runtime_mysql_replication_hostgroups |
| runtime_mysql_servers               |
| runtime_mysql_users                 |
| runtime_scheduler                   |
| scheduler                           |
+--------------------------------------+
13 rows in set (0.00 sec)

Admin> show tables from stats;
+--------------------------------+
| tables                         |
+--------------------------------+
| global_variables               |
| stats_mysql_commands_counters |
| stats_mysql_connection_pool   |
| stats_mysql_global             |
| stats_mysql_processlist       |
| stats_mysql_query_digest       |
| stats_mysql_query_digest_reset |
| stats_mysql_query_rules       |
+--------------------------------+
8 rows in set (0.00 sec)

mysql_servers

Admin> show create table mysql_servers\G

    CREATE TABLE mysql_servers (  

hostgroup_id INT NOT NULL DEFAULT 0,  

hostname VARCHAR NOT NULL,  

port INT NOT NULL DEFAULT 3306,  

status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE',  

weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1,  

compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0,  

max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000,  

max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0,  

use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0,  

max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0, 

comment VARCHAR NOT NULL DEFAULT '',  

PRIMARY KEY (hostgroup_id, hostname, port) )

1 row in set (0.00 sec)

mysql_servers對(duì)數(shù)據(jù)庫實(shí)例進(jìn)行了分組和實(shí)例信息配置。
 ·hostgroup_id: MySQL實(shí)例所屬組
 · status:
 · ONLINE: 運(yùn)行狀態(tài)
 · SHUNNED: 數(shù)據(jù)庫被處于暫時(shí)踢出狀態(tài),由于后臺(tái)數(shù)據(jù)庫出現(xiàn)“too many connections error”或者后端數(shù)據(jù)庫主從延時(shí)超過了允許的閾值。
 · OFFLINE_SOFT: “軟離線”狀態(tài),不再接受新的連接,但已建立的連接會(huì)等待活躍事務(wù)完
 · OFFLINE_HARD: “硬離線”狀態(tài),不再接受新的連接,已建立的連接或被強(qiáng)制中斷。當(dāng)后端實(shí)例宕機(jī)或網(wǎng)絡(luò)不可達(dá),會(huì)出現(xiàn)。
 · weight:負(fù)載均衡時(shí)選擇后端數(shù)據(jù)庫的權(quán)重值,權(quán)重越高被選中的比率越高。
 · max_connections:允許連接到該后端實(shí)例的最大連接數(shù),不要設(shè)置此值大于后端數(shù)據(jù)庫的最多連接數(shù)。
 · max_latency_ms:mysql_ping 響應(yīng)時(shí)間,大于這個(gè)閥值會(huì)把它從連接池剔除(即使是ONLINE)


mysql_replication_hostgroups


此表用于傳統(tǒng)的異步/半同步的主從復(fù)制,對(duì)于MGT/GALERA需要使用mysql_group_replication_hostgroups或者mysql_galera_hostgroups(ProxySQL 2.x之后)。在此表中的每一行代表一對(duì)writer_hostgroup和reader_hostgroup。ProxySQL將監(jiān)控read_only的值,ProxySQL將基于read_only的值來分配MySQL實(shí)例為reader_hostgroup還是writer_hostgroup,,如果發(fā)現(xiàn)從庫的 read_only 變?yōu)?、主庫變?yōu)?,則認(rèn)為角色互換了,自動(dòng)改寫 mysql_servers 表里面 hostgroup 關(guān)系,達(dá)到自動(dòng) Failover 效果。


Admin> SHOW CREATE TABLE mysql_replication_hostgroups\G

*************************** 1. row *************************** 

     table: mysql_replication_hostgroupsCreate Table: 

CREATE TABLE mysql_replication_hostgroups (

  writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,

  reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0),

  check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only',

  comment VARCHAR,  UNIQUE (reader_hostgroup))

1 row in set (0.00 sec)


mysql_users


CREATE TABLE mysql_users (  

 username VARCHAR NOT NULL,  

 password VARCHAR, 

 active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,  use_ssl INT CHECK (

 use_ssl IN (0,1)) NOT NULL DEFAULT 0,

 default_hostgroup INT NOT NULL DEFAULT 0, 

 default_schema VARCHAR, 

 schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0,

 transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 0, 

 fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0, 

 backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1, 

 frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1, 

 max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000, 

 PRIMARY KEY (username, backend), 

 UNIQUE (username, frontend)

)

· username, password: 連接后端db的用戶密碼。這個(gè)密碼你可以插入明文,也可以插入hash加密后的密文。
· default_hostgroup: 這個(gè)用戶的請(qǐng)求沒有匹配到規(guī)則時(shí),默認(rèn)發(fā)到這個(gè) hostgroup。
· default_schema: 這個(gè)用戶連接時(shí)沒有指定 database name 時(shí),默認(rèn)使用的schema 注意表面上看默認(rèn)為NULL,但實(shí)際上受到變量 mysql-default_schema 的影響,默認(rèn)為 information_schema。
· transaction_persistent: 如果設(shè)置為1,連接上ProxySQL的會(huì)話后,如果在一個(gè)hostgroup上開啟了事務(wù),那么后續(xù)的sql都繼續(xù)維持在這個(gè)hostgroup上,不倫是否會(huì)匹配上其它路由規(guī)則,直到事務(wù)結(jié)束。
· fast_forward: 忽略查詢重寫/緩存層,直接把這個(gè)用戶的請(qǐng)求透?jìng)鞯胶蠖薉B。相當(dāng)于只用它的連接池功能,一般不用,路由規(guī)則 .* 就行了。


mysql_query_rules

CREATE TABLE mysql_query_rules (  

  rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,  

  active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0, 

  username VARCHAR, 

  schemaname VARCHAR, 

  flagIN INT NOT NULL DEFAULT 0, 

  client_addr VARCHAR, 

  proxy_addr VARCHAR,

  proxy_port INT,

  digest VARCHAR, 

  match_digest VARCHAR, 

  match_pattern VARCHAR, 

  negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0, 

  flagOUT INT, 

  replace_pattern VARCHAR,

  destination_hostgroup INT DEFAULT NULL,

  cache_ttl INT CHECK(cache_ttl > 0),

  reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL,

  timeout INT UNSIGNED,

  retries INT CHECK (retries>=0 AND retries <=1000),

  delay INT UNSIGNED,  mirror_flagOUT INT UNSIGNED,

  mirror_hostgroup INT UNSIGNED,  error_msg VARCHAR,

  log INT CHECK (log IN (0,1)),

  apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0,

  comment VARCHAR)


 · rule_id: 表主鍵,自增。規(guī)則處理是以 rule_id 的順序進(jìn)行。

 · active: 只有 active=1 的規(guī)則才會(huì)參與匹配。
username: 如果非 NULL,只有連接用戶是 username 的值才會(huì)匹配
 · : 如果非 NULL,只有查詢連接使用的db是 schemaname 的值才會(huì)匹配。
 · client_addr: 匹配客戶端來源IP
  · digest: 精確的匹配一類查詢。
 · match_digest: 使用正則來匹配查詢指紋(去掉查詢參數(shù)后的查詢)
  · match_pattern: 正則匹配查詢文本。
  · negate_match_pattern: 反向匹配,相當(dāng)于對(duì) match_digest/match_pattern 的匹配取反。
  · re_modifiers: 修改正則匹配的參數(shù),比如默認(rèn)的:忽略大小寫CASELESS、禁用GLOBAL上面都是匹配規(guī)則。
  · replace_pattern: 查詢重寫,默認(rèn)為空,不rewrite。
  · destination_hostgroup: 路由查詢到這個(gè) hostgroup。當(dāng)然如果用戶顯式 start transaction 且 transaction_persistent=1,那么即使匹配到了,也依然按照事務(wù)里第一條sql的路由規(guī)則去走。
  · cache_ttl: 查詢結(jié)果緩存的毫秒數(shù)。
  · timeout: 這一類查詢執(zhí)行的最大時(shí)間(毫秒),超時(shí)則自動(dòng)kill.
  · retries: 語句在執(zhí)行時(shí)失敗時(shí),重試次數(shù)。默認(rèn)由 mysql-query_retries_on_failure變量指定,為1。
  · delay: 查詢延遲執(zhí)行,這是ProxySQL提供的限流機(jī)制,會(huì)讓其它的查詢優(yōu)先執(zhí)行。
  · error_msg: 默認(rèn)為NULL,如果指定了則這個(gè)查詢直接被 block 掉,馬上返回這個(gè)錯(cuò)誤信息。
  · multiplex: 連接是否復(fù)用。
  · log: 是否記錄查詢?nèi)罩???梢钥吹絣og是否記錄的對(duì)象是根據(jù)規(guī)則。


讀寫分離


ProxySQL作為中間件能夠監(jiān)聽接收到應(yīng)用程序端的數(shù)據(jù)庫請(qǐng)求,并解析前端的SQL語句并將解析結(jié)果與查詢規(guī)則進(jìn)行匹配,將匹配的SQL發(fā)送到相應(yīng)的MySQL實(shí)例從而實(shí)現(xiàn)讀寫分離。這個(gè)過程入下圖所示:

 

MySQL高可用實(shí)現(xiàn):主從結(jié)構(gòu)下ProxySQL中的讀寫分離


1. 搭建MySQL主從,結(jié)構(gòu)如下:

master: 192.168.20.31:3306

slave1: 192.168.20.32:3306

slave2:  192.168.20.33:3306

2. 在主庫中創(chuàng)建監(jiān)控賬號(hào)用于ProxySQL監(jiān)控目標(biāo)主機(jī)。

create user 'monitor'@'%' identified with mysql_native_password by 'monitor';

grant select on sys.* to 'monitor'@'%';

grant select on performance_schema.* to 'monitor'@'%';

flush privileges;

3. 插入3個(gè)數(shù)據(jù)庫實(shí)例節(jié)點(diǎn)到ProxySQL

Admin> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values(10,20);

Admin> insert into mysql_servers (hostgroup_id,hostname,port) values (10,'192.168.20.31',3306);

Admin> insert into mysql_servers (hostgroup_id,hostname,port) values (20,'192.168.20.32',3306);

Admin> insert into mysql_servers (hostgroup_id,hostname,port) values (10,'192.168.20.33',3306);

Admin> save mysql servers to disk;

Admin> load mysql servers to runtime;

4. 配置讀寫分離規(guī)則

Admin> INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES

(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);

Admin> LOAD MYSQL QUERY RULES TO RUNTIME;

Admin> SAVE MYSQL QUERY RULES TO DISK;

5. 配置MySQL用戶到ProxySQL

Admin> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('app','pass',10);

Admin> save mysql users to disk;

Admin> load mysql users to runtime;


ProxySQL + Orchestrator實(shí)現(xiàn)高可用


Orchestrator(https://github.com/github/orchestrator)是MySQL復(fù)制結(jié)構(gòu)的一個(gè)拓?fù)涔芾砉ぞ?能夠自動(dòng)檢測(cè)MySQL拓?fù)浣Y(jié)構(gòu),當(dāng)主庫出現(xiàn)故障時(shí)能夠自動(dòng)將“最優(yōu)”從庫提升為主庫。Orchestrator提供了豐富的API接口和故障檢測(cè)以及故障切換的鉤子函數(shù),MyData正是通過Orchestrator提供的鉤子函數(shù)配合ProxySQL、Keepalived、HAProxy實(shí)現(xiàn)對(duì)應(yīng)用程序無感知的故障切換。


切換流程:


1. 首先Orchestrator檢測(cè)的后端主庫出現(xiàn)故障后會(huì)通過從庫二次確認(rèn)主庫出現(xiàn)故障,避免了主庫高負(fù)載時(shí)出現(xiàn)誤判主庫down機(jī)。

2. Orchestrator切換之前將調(diào)用PreFailoverProcesses鉤子函數(shù),MyData在鉤子函數(shù)中首先將“down”機(jī)的主庫從ProxySQL中踢出,避免應(yīng)用程序?qū)⒄?qǐng)求寫入到“假死”的主庫,執(zhí)行語句如下:

#強(qiáng)制關(guān)閉與假死主庫的連接,避免數(shù)據(jù)被寫入的假死的老主庫。
Admin> update runtime_mysql_servers set status="HARD_OFFLINE" where hostname='192.168.20.31' and port='3306'


#將假死的老主庫提出集群,避免后續(xù)數(shù)據(jù)被寫入到老主庫
Admin> delete from mysql_servers where hostname='192.168.20.31' and port='3306'
Admin> load mysql servers to runtime
Admin> save mysql serbers to disk

3. MyData能夠根據(jù)用戶RPO、RTO“智能”作出恢復(fù)決定。


4. MyData通知Orchestrator開發(fā)切換,Orchestrator切換完成之后,將修改新主庫的read_only值為0。

5. ProxySQL將新的寫請(qǐng)求路由到主庫。

整個(gè)流程之中MyData作了大量?jī)?yōu)化,能夠在滿足用戶RTO情況下,能將用戶丟失的數(shù)據(jù)減少到原來的10%以下,MyData還為ProxySQL本身提供了高可用方案,避免了ProxySQL本身的單點(diǎn)故障。


總結(jié)


ProxySQL提供強(qiáng)大的路由規(guī)則。當(dāng)應(yīng)用程序自身不支持讀寫分離時(shí),DBA可以通過配置路由規(guī)則為應(yīng)用程序提供透明的讀寫分離,使用Keepalived + ProxySQL + Orchestrator為主從提供高可用時(shí),能夠有效的避免keepalived + 雙主結(jié)構(gòu) 由于keepalived腦裂而造成數(shù)據(jù)被寫錯(cuò)亂的痛點(diǎn)。


關(guān)于MyData


MyData是云和恩墨自主研發(fā)的,針對(duì)MySQL數(shù)據(jù)庫提供高可用、高可靠、高安全性和易于使用的整體解決方案。MyData融合了云和恩墨資深數(shù)據(jù)庫工程師的經(jīng)驗(yàn)和最佳實(shí)踐,來幫助客戶快速構(gòu)建高可用的數(shù)據(jù)庫集群環(huán)境,保證了MySQL數(shù)據(jù)庫運(yùn)行環(huán)境符合企業(yè)級(jí)數(shù)據(jù)庫的要求,幫助客戶提高快速交付的能力。
云和恩墨對(duì)MyData提供專業(yè)、靈動(dòng)的端到端服務(wù),涵蓋規(guī)劃設(shè)計(jì)、建設(shè)實(shí)施、運(yùn)營(yíng)管理和優(yōu)化提升四個(gè)階段,為客戶構(gòu)建安全、連續(xù)、高效和穩(wěn)定的數(shù)據(jù)環(huán)境。
MyData目前已經(jīng)在政府和金融行業(yè)擁有多個(gè)最佳實(shí)踐的案例,致力于為企業(yè)提供開展開源數(shù)據(jù)庫一體化的解決方案。


想了解更多關(guān)于數(shù)據(jù)庫、云技術(shù)嗎?

快來關(guān)注”數(shù)據(jù)和云“公眾號(hào),”云和恩墨“官方網(wǎng)站,我們期待與大家一同學(xué)習(xí)和進(jìn)步。


網(wǎng)站欄目:MySQL高可用實(shí)現(xiàn):主從結(jié)構(gòu)下ProxySQL中的讀寫分離
標(biāo)題網(wǎng)址:http://muchs.cn/article4/jepiie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化、網(wǎng)站改版、Google、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管