Haproxy+多臺MySQL從服務器(Slave) 實現負載均衡

本系統采用MySQL一主多從模式設計,即1臺 MySQL“主”服務器(Master)+多臺“從”服務器(Slave),“從”服務器之間通過Haproxy進行負載均衡,對外只提供一個訪問IP,當程序需要訪問多臺"從"服務器時,只需要訪問Haproxy,再由Haproxy將請求分發到各個數據庫節點。


我們的程序可以有倆個數據源(DataSourceA,DataSourceB),一個(DataSourceA)直接連接主庫,另外一個(DataSourceB)連接Haproxy,當需要寫入操作時可以使用DataSourceA,讀取時使用DataSourceB。


設計圖如下:



看到這里大家可能會有一個疑問,這個問題就是主從數據庫之間數據同步延時的問題!

因為大多數使用MySQL主從同步數據都是異步的,也就是說當主庫的數據發生變化時并不能立即的更新從庫,這么做的目的也是為了更好的性能,那么設想一下,當用戶新增一條記錄后立刻去從庫查詢,可能并不能查到剛剛新增的數據,這豈不是很腦裂的問題~~~。


然而實際情況并不應該是這樣的,我們也不應該這樣去設計程序,我們就拿一個類似于CSND博客管理的系統來說,假設一個“博客系統”只有倆部分, 一部分是博客管理后臺,用戶可以在后臺新增,編輯,刪除博客。另一部分是門戶網站,負責展示所有用戶的博客信息,相對于這樣一個系統來說, 后臺管理模塊對數據庫的操作壓力不是很大,相反門戶網站讀取博客信息對數據庫的壓力很大,這也式一般互聯網產品的特點,而且最重要的一點是系統可以接受主從同步數據帶來的延遲,也就是說當用戶在后臺新增一條博客時,前臺門戶網站并不能立即查詢到這條信息。一般都是再過一段時間后才會出現在首頁,因為大多數系統都有緩存設置,這樣正好給主從同步延遲帶來時間。


接著說上面的問題,有的同學可能會有這樣的疑問,就是后臺用戶在新增一條記錄后,一般都是立即查詢返回博客列表,按照上面說的豈不是查詢不到~~~,我覺得這個問題可以這么解決:

1、后臺用戶在進行 新增,查詢,編輯,刪除等操作時直接連接主庫,這樣無論什么操作都是實時的,因為后臺操作對數據庫的壓力不是很大,所以讀寫全部連接主庫應該沒什么問題!?

2、門戶網站查詢博客列表時從 “從庫集群中查詢“,通過負載均衡技術,解決了擴展性,高可用性等問題,同時門戶網站首頁也不需要實時查詢主庫中的數據,因為網站本身一般都有緩存,也不是實時的。


上面的架構設計只是拋磚引玉,大家有什么好想法也可以相互交流~

本文重點介紹的內容有二點:

1、如何使用Haproxy給MySQL做負載均衡,提供相關的配置說明,健康檢查等等。

2、當程序通過連接Haproxy代理之后,如何解決程序中連接池長連接失效的問題。


下面介紹如何安裝配置Haproxy~

1、首先進行負載均衡配置。

假設兩臺MySQL(slave)從服務器 ?A:192.168.1.191:3306 ? ? ?B:192.168.1.192:3306。


首先在linxu上安裝Haproxy,安裝過程略。。。。。。

安裝完畢后打開配置文件在/etc/haproxy/?haproxy.cfg,配置文件的路徑可能不用,別告訴我找不到~~~!

[html]?view plain?copy?print?

  1. global??

  2. ????????maxconn?4096??

  3. ????????daemon??

  4. ????????chroot??????/var/lib/haproxy??

  5. ????????pidfile?????/var/run/haproxy.pid??

  6. ????????#debug??

  7. ????????#quiet??

  8. ????????user?haproxy??

  9. ????????group?haproxy??

  10. ???

  11. defaults??

  12. ????????log?????global??

  13. ????????mode????http??

  14. ????????option??httplog??

  15. ????????option??dontlognull??

  16. ????????log?127.0.0.1?local0??

  17. ????????retries?3??

  18. ????????option?redispatch??

  19. ????????maxconn?2000??

  20. ????????#contimeout??????5000??

  21. ????????#clitimeout??????50000??

  22. ????????#srvtimeout??????50000??

  23. ????????timeout?http-request????10s??

  24. ????????timeout?queue???????????1m??

  25. ????????timeout?connect?????????10s??

  26. ????????timeout?client??????????1m??

  27. ????????timeout?server??????????1m??

  28. ????????timeout?http-keep-alive?10s??

  29. ????????timeout?check???????????10s??

  30. ???

  31. listen??admin_stats?0.0.0.0:8888??

  32. ????????mode????????http??

  33. ????????stats?uri???/dbs??

  34. ????????stats?realm?????Global\?statistics??

  35. ????????stats?auth??admin:admin??

  36. ???

  37. listen??proxy-mysql?0.0.0.0:23306??

  38. ????????mode?tcp??

  39. ????????balance?roundrobin??

  40. ????????option?tcplog??

  41. ????????option?mysql-check?user?haproxy?#在mysql中創建無任何權限用戶haproxy,且無密碼??

  42. ????????server?MySQL1?192.168.1.191:3306?check?weight?1?maxconn?2000??

  43. ????????server?MySQL2?192.168.1.192:3306?check?weight?1?maxconn?2000??

  44. ????????option?tcpka??


[html]?view plain?copy?print?

  1. listen??admin_stats?0.0.0.0:8888?這個配置是監控頁面,綁定到本機8888端口,賬號admin,密碼admin??

save_snippets_01.png

listen??admin_stats?0.0.0.0:8888?這個配置是監控頁面,綁定到本機8888端口,賬號admin,密碼admin

可以通過web的方式查看所有MySQL節點的使用情況, http://你的IP:8888/dbs 即可登錄監控后臺。

如下圖:



[html]?view plain?copy?print?

  1. listen??proxy-mysql?0.0.0.0:23306??

  2. ????????mode?tcp??

  3. ????????balance?roundrobin??

  4. ????????option?tcplog??

  5. ????????option?mysql-check?user?haproxy?#在mysql中創建無任何權限用戶haproxy,且無密碼??

  6. ????????server?MySQL1?192.168.1.191:3306?check?weight?1?maxconn?2000??

  7. ????????server?MySQL2?192.168.1.192:3306?check?weight?1?maxconn?2000??

  8. ????????option?tcpka??

save_snippets.png

listen??proxy-mysql?0.0.0.0:23306mode?tcpbalance?roundrobinoption?tcplogoption?mysql-check?user?haproxy?#在mysql中創建無任何權限用戶haproxy,且無密碼server?MySQL1?192.168.1.191:3306?check?weight?1?maxconn?2000server?MySQL2?192.168.1.192:3306?check?weight?1?maxconn?2000option?tcpka

[html]?view plain?copy?print?

  1. </pre><pre?name="code"?class="html">proxy-mysql?0.0.0.0:23306?代理的端口。我們程序連接從庫集群時就訪問這個端口。??

save_snippets_01.png

</pre><pre?name="code"?class="html">proxy-mysql?0.0.0.0:23306?代理的端口。我們程序連接從庫集群時就訪問這個端口。

[html]?view plain?copy?print?

  1. balance?roundrobin?負載均衡方式,有很多種,可以去Google。??

save_snippets_01.png

balance?roundrobin?負載均衡方式,有很多種,可以去Google。

[html]?view plain?copy?print?

  1. option?mysql-check?user?haproxy?這里是配置健康檢查的,也是haproxy自帶的功能,<span?style="color:#ff6666;">需要在<span?style="font-family:?Arial,?Helvetica,?sans-serif;">mysql中創建無任何權限用戶haproxy,且無密碼</span></span>??

save_snippets.png

option?mysql-check?user?haproxy?這里是配置健康檢查的,也是haproxy自帶的功能,<span?style="color:#ff6666;">需要在<span?style="font-family:?Arial,?Helvetica,?sans-serif;">mysql中創建無任何權限用戶haproxy,且無密碼</span></span>

[html]?view plain?copy?print?

  1. server?MySQL1?192.168.1.191:3306?check?weight?1?maxconn?2000?配置MySQL從庫節點,有多少配置多少就行了。??

save_snippets_01.png

server?MySQL1?192.168.1.191:3306?check?weight?1?maxconn?2000?配置MySQL從庫節點,有多少配置多少就行了。



有的同學可能不知道如何在MySQL中創建用戶,這里也給你寫好了。

用戶名為haproxy 且無密碼(重要) 否則haproxy無法檢測MySQL狀態。

CREATE USER 'haproxy'@'%' IDENTIFIED BY '';?


配置完成后啟動代理 service haproxy start ?如果用過yum方式安裝,應該就能啟動了,如果是其它方式安裝,可能啟動方式不同,需要編寫腳本啟動,應該不難自己研究一下~~~


然后讓我們寫個demo測試一下代理是否配置成功了沒!


[java]?view plain?copy?print?

  1. public?static?void?main(String[]?args)?throws?Exception?{??

  2. ??????

  3. ??????

  4. ????Class.forName("com.mysql.jdbc.Driver");??

  5. ????Connection?conn?=?DriverManager.getConnection("jdbc:mysql://你的IP:23306/template?useUnicode=true",?"root",?"sql2008");??

  6. ??????

  7. ????for?(int?i?=?0;?i?<?100;?i++)?{??

  8. ????????PreparedStatement?pr?=?null;??

  9. ????????ResultSet?res?=?null;??

  10. ????????try?{??

  11. ?????????????pr?=?conn.prepareStatement("select?count(*)?from?sys_user");??

  12. ?????????????res?=?pr.executeQuery();??

  13. ????????????if(res.next())?{??

  14. ????????????????System.out.println(new?Date().toLocaleString()?+?"->"?+?res.getInt(1));??

  15. ????????????}??

  16. ????????}?catch?(Exception?e)?{??

  17. ????????????e.printStackTrace();??

  18. ????????????res.close();??

  19. ????????????pr.close();??

  20. ????????}??

  21. ??????????

  22. ????????Thread.sleep(25000);??

  23. ????}??

  24. ??????

  25. ????conn.close();??

  26. }??

save_snippets.png

	public?static?void?main(String[]?args)?throws?Exception?{Class.forName("com.mysql.jdbc.Driver");Connection?conn?=?DriverManager.getConnection("jdbc:mysql://你的IP:23306/template?useUnicode=true",?"root",?"sql2008");for?(int?i?=?0;?i?<?100;?i++)?{PreparedStatement?pr?=?null;ResultSet?res?=?null;try?{pr?=?conn.prepareStatement("select?count(*)?from?sys_user");res?=?pr.executeQuery();if(res.next())?{System.out.println(new?Date().toLocaleString()?+?"->"?+?res.getInt(1));}}?catch?(Exception?e)?{e.printStackTrace();res.close();pr.close();}Thread.sleep(25000);}conn.close();}



輸出結果如下:可以看到代理MySQL成功了,這時你可以隨機關掉一個MySQL節點的服務,程序依然能夠正常的執行,說明負載均衡也成功了。

[html]?view plain?copy?print?

  1. 2015-8-28?10:09:27->7??

  2. 2015-8-28?10:09:52->7??

  3. 2015-8-28?10:10:17->7??

  4. 2015-8-28?10:10:42->7??

  5. 2015-8-28?10:11:07->7??

save_snippets.png

2015-8-28?10:09:27->7
2015-8-28?10:09:52->7
2015-8-28?10:10:17->7
2015-8-28?10:10:42->7
2015-8-28?10:11:07->7




小小的激動有沒有~有沒有~。于是乎我們就把程序中數據源的配置改造一下,讓它連接haproxy即可。

<property name="jdbcUrl" value="jdbc:mysql://你的IP:23306/template?useUnicode=true" /> .

是不是以為大功告成了,如果你就這樣配置的話,等程序運行起來它就會給你一個大大的surprise大笑

其實這里面是有坑的~~~~,且聽我細細道來。


一般的情況下,我相信大家在直接連接MySQL的時候幾乎都用到了連接池。

以我的配置為例:

[html]?view plain?copy?print?

  1. ??<bean?id="dataSource"?class="com.mchange.v2.c3p0.ComboPooledDataSource"?destroy-method="close">??

  2. <property?name="driverClass"?value="com.mysql.jdbc.Driver"?/>??

  3. <property?name="jdbcUrl"?value="jdbc:mysql://你的IP:23306/你的數據庫名稱?useUnicode=true"?/>??

  4. <property?name="user"?value="xx"?/>??

  5. <property?name="password"?value="yy"?/>??

  6. <property?name="initialPoolSize"?value="5"?/>??

  7. <property?name="minPoolSize"?value="5"?/>??

  8. <property?name="maxPoolSize"?value="30"?/>??

  9. <property?name="maxIdleTime"?value="0"?/>??

  10. <property?name="idleConnectionTestPeriod"?value="30"?/>??

  11. <property?name="acquireIncrement"?value="3"?/>??

  12. <property?name="automaticTestTable"?value="C3p0TestTable_NotDelete"?/>??

  13. <property?name="autoCommitOnClose"?value="false"?/>??

  14. lt;/bean>??

save_snippets.png

????<bean?id="dataSource"?class="com.mchange.v2.c3p0.ComboPooledDataSource"?destroy-method="close"><property?name="driverClass"?value="com.mysql.jdbc.Driver"?/><property?name="jdbcUrl"?value="jdbc:mysql://你的IP:23306/你的數據庫名稱?useUnicode=true"?/><property?name="user"?value="xx"?/><property?name="password"?value="yy"?/><property?name="initialPoolSize"?value="5"?/><property?name="minPoolSize"?value="5"?/><property?name="maxPoolSize"?value="30"?/><property?name="maxIdleTime"?value="0"?/><property?name="idleConnectionTestPeriod"?value="30"?/><property?name="acquireIncrement"?value="3"?/><property?name="automaticTestTable"?value="C3p0TestTable_NotDelete"?/><property?name="autoCommitOnClose"?value="false"?/></bean>


其它的參數這里不解釋,大家可以查詢C3P0配置信息,網上很多。


這里只說一個:

[html]?view plain?copy?print?

  1. idleConnectionTestPeriod=30?這個參數是配置連接池?每隔多少時間去檢查池內鏈接的有效性,單位秒。??

save_snippets_01.png

idleConnectionTestPeriod=30?這個參數是配置連接池?每隔多少時間去檢查池內鏈接的有效性,單位秒。

[html]?view plain?copy?print?

  1. 我這里設置成30秒,那么C3P0會每隔30秒?把連接池內所有的空閑連接拿出來挨個發一個測試SQL語句,已確定這個鏈接的有效性。??

save_snippets_01.png

我這里設置成30秒,那么C3P0會每隔30秒?把連接池內所有的空閑連接拿出來挨個發一個測試SQL語句,已確定這個鏈接的有效性。


以前我們的數據源是直接連接MySQL數據庫的,在正常的情況下MySQL是不會斷開這個鏈接的。

但是我們現在連接的是haproxy,也就是說我們程序的連接(Connection)是與haproxy建立的,這里的坑在于這個連接是會被haproxy斷掉的,這樣的話你連接池內的鏈接就變成了無效鏈接,在下次需要查詢數據庫時還需要重新創建連接,而且程序由于拿到的連接是無效鏈接,還有可能報錯。


那么haproxy與我們程序之間的連接超時時間在哪設置呢?

[html]?view plain?copy?print?

  1. timeout?client??????????1m??#這個參數配置程序與haproxy的鏈接超時時間??

  2. timeout?server??????????1m??<span?style="font-family:?Arial,?Helvetica,?sans-serif;">#這個參haproxy與mysql鏈接超時時間</span>??

save_snippets.png

????????timeout?client??????????1m??#這個參數配置程序與haproxy的鏈接超時時間timeout?server??????????1m??<span?style="font-family:?Arial,?Helvetica,?sans-serif;">#這個參haproxy與mysql鏈接超時時間</span>

這里的超時時間不是指連接過程的超時時間,而是指連接上以后,多少時間內沒有心跳,操作這個時間就認為超時,然后斷開連接。


寫的可能有些啰嗦,我們看個例子開說明一下:

[java]?view plain?copy?print?

  1. public?static?void?main(String[]?args)?throws?Exception?{??

  2. ??????

  3. ??????

  4. ????Class.forName("com.mysql.jdbc.Driver");??

  5. ????Connection?conn?=?DriverManager.getConnection("jdbc:mysql://你的IP:23306/template?useUnicode=true",?"root",?"sql2008");??

  6. ??????

  7. ????for?(int?i?=?0;?i?<?100;?i++)?{??

  8. ????????PreparedStatement?pr?=?null;??

  9. ????????ResultSet?res?=?null;??

  10. ????????try?{??

  11. ?????????????pr?=?conn.prepareStatement("select?count(*)?from?sys_user");??

  12. ?????????????res?=?pr.executeQuery();??

  13. ????????????if(res.next())?{??

  14. ????????????????System.out.println(new?Date().toLocaleString()?+?"->"?+?res.getInt(1));??

  15. ????????????}??

  16. ????????}?catch?(Exception?e)?{??

  17. ????????????e.printStackTrace();??

  18. ????????????res.close();??

  19. ????????????pr.close();??

  20. ????????}??

  21. ??????????

  22. ????????Thread.sleep(60000);??

  23. ????}??

  24. ??????

  25. ????conn.close();??

  26. }??

save_snippets.png

	public?static?void?main(String[]?args)?throws?Exception?{Class.forName("com.mysql.jdbc.Driver");Connection?conn?=?DriverManager.getConnection("jdbc:mysql://你的IP:23306/template?useUnicode=true",?"root",?"sql2008");for?(int?i?=?0;?i?<?100;?i++)?{PreparedStatement?pr?=?null;ResultSet?res?=?null;try?{pr?=?conn.prepareStatement("select?count(*)?from?sys_user");res?=?pr.executeQuery();if(res.next())?{System.out.println(new?Date().toLocaleString()?+?"->"?+?res.getInt(1));}}?catch?(Exception?e)?{e.printStackTrace();res.close();pr.close();}Thread.sleep(60000);}conn.close();}




我上面配置的是?timeout client 1m ,也就是說客戶端連接到haproxy后 1分鐘之內沒有數據請求即為超時,就會斷掉鏈接:

[html]?view plain?copy?print?

  1. <pre?name="code"?class="java"><pre?name="code"?class="java"?style="font-size:18px;">第一次查詢沒有問題:??

save_snippets_01.png

<pre?name="code"?class="java"><pre?name="code"?class="java"?style="font-size:18px;">第一次查詢沒有問題:

Thread.sleep(60000); 我把間隔設置為60秒,第二次查詢與第一次查詢間隔60秒就會報錯,因為超時了。



[java]?view plain?copy?print?

  1. 那如果我把間隔改為?<span?style="font-family:?Arial,?Helvetica,?sans-serif;">Thread.sleep(50000);?50秒,就不會報錯。</span>??

save_snippets_01.png

那如果我把間隔改為?<span?style="font-family:?Arial,?Helvetica,?sans-serif;">Thread.sleep(50000);?50秒,就不會報錯。</span>



結論就是

[html]?view plain?copy?print?

  1. idleConnectionTestPeriod?的時間一定要小于?<span?style="font-size:18px;?background-color:?rgb(240,?240,?240);">timeout?client的時間。這樣C3P0會在Haproxy斷掉鏈接之前發送一次“心跳”過去,保持鏈接的有效性。</span>??

save_snippets.png

idleConnectionTestPeriod?的時間一定要小于?<span?style="font-size:18px;?background-color:?rgb(240,?240,?240);">timeout?client的時間。這樣C3P0會在Haproxy斷掉鏈接之前發送一次“心跳”過去,保持鏈接的有效性。</span>

[html]?view plain?copy?print?

  1. <span?style="font-size:18px;?background-color:?rgb(240,?240,?240);">而且?</span><span?style="font-family:?Arial,?Helvetica,?sans-serif;">timeout?client與?</span><span?style="font-family:?Arial,?Helvetica,?sans-serif;">timeout?server?盡量保持一致,已達到最佳效果。</span>??







本文轉自yzy121403725 51CTO博客,原文鏈接:http://blog.51cto.com/lookingdream/1828380,如需轉載請自行聯系原作者



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

愛普生第三方相機_值得購買第三方相機鏡頭嗎?

愛普生第三方相機When people buy a Canon or Nikon camera, they often assume that they can only buy Canon or Nikon lenses. But that isn’t true. While Nikon lenses won’t work on your Canon camera, there are third-party lens manufacturers—such as Sigma, Tam…

[BZOJ4182]Shopping

description 權限題。 樹上\(n\)個節點每個節點都有一種物品&#xff0c;每種物品有其價值&#xff0c;價格&#xff0c;數量&#xff0c;只能買一個連通塊中的物品&#xff0c;求\(m\)元能買到物品價值的最大值。 data range \[ n\le 500,m\le 4000,T\le 5,c_i\le m\] solutio…

如何用 Flutter 實現混合開發?閑魚公開源代碼實例

2019獨角獸企業重金招聘Python工程師標準>>> 具有一定規模的 App 通常有一套成熟通用的基礎庫&#xff0c;尤其是阿里系 App&#xff0c;一般需要依賴很多體系內的基礎庫。那么使用 Flutter 重新從頭開發 App 的成本和風險都較高。所以在 Native App 進行漸進式遷移…

Silverlight之工具箱使用1

我們在開發Silverlight項目時必定需要使用VS自帶的一些控件&#xff0c;但是這些有限的控件有時候難以滿足開發時的需求&#xff0c;因此MS給我們大家提供另外一套工具&#xff0c;來緩解Silverlight開發包的不足。此工具箱免費下載地址是&#xff1a;http://silverlight.codep…

apple tv設置_如何設置Apple HomePod

apple tv設置Apple’s HomePod smart speaker is finally here. If you bought one and are eager to get going, here’s how to set it up. 蘋果的HomePod智能揚聲器終于來了。 如果您購買了一個并且渴望上手&#xff0c;請按照以下步驟進行設置。 First off, before you eve…

leetcode 128最長連續序列

方法一&#xff1a;使用快排&#xff1a; //排序法&#xff0c;時間O(nlogn)&#xff0c;使用STL&#xff0c;只是驗證一下思想&#xff0c;非正解&#xff1b; class Solution { public:int longestConsecutive(vector<int>& nums) {sort(nums.begin(),nums.end());…

8月19學習練習[兩三個TableView并排顯示]

要求&#xff1a;在一個view中顯示兩個tableView&#xff0c;要求左右顯示的內容以及行數不一樣&#xff0c;且左邊每行顯示兩張圖片&#xff08;分別3個一輪回&#xff0c;2個一輪回&#xff09;并且顯示中國的城市名&#xff0c;右邊顯示水果名。點擊時分別顯示城市名或水果名…

word多級列表創建目錄_如何在Microsoft Word中創建和使用多級列表

word多級列表創建目錄Microsoft Word lets you easily create and format multilevel lists in your documents. You can choose from a variety of formatting options, including bulleted, numbered, or alphabetized lists. Let’s take a look. Microsoft Word使您可以輕松…

如何將多個Android Wear手表與單個手機配對

When it comes to “regular” wristwatches, a lot of people have different watches for different activities. It makes sense—a sporty watch for the gym, a nicer watch for the office, and a casual watch for everything else. If you want to live this life with…

Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析(3)...

提供引用計數器的類RefBase我們就暫時介紹到這里&#xff0c;后面我們再結合智能指針類一起分析&#xff0c;現在先來看看強指針類和弱指針類的定義。強指針類的定義我們在前面介紹輕量級指針的時候已經見到了&#xff0c;就是sp類了&#xff0c;這里就不再把它的代碼列出來了。…

ref:下一個項目為什么要用 SLF4J

ref:http://blog.mayongfa.cn/267.html 阿里巴巴 Java 開發手冊 前幾天阿里巴巴在云棲社區首次公開阿里官方Java代碼規范標準&#xff0c;就是一個PDF手冊&#xff0c;有命名規范&#xff0c;讓你知道自己原來取的每一個類名、變量名都是爛名字&#xff0c;真替你家未來孩子擔心…

洛谷P5055 【模板】可持久化文藝平衡樹(FHQ Treap)

題面 傳送門 題解 日常敲板子.jpg //minamoto #include<bits/stdc.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i(a),I(b)1;i<I;i) #define fd(i,a,b) for(R int i(a),I(b)-1;i>I;--i) #define …

計算機突然藍屏無法啟動_為什么計算機無法立即啟動?

計算機突然藍屏無法啟動With the newer, more powerful hardware and improved operating systems that we have available to use these days, why does it still take as long as it does to fully boot a computer up each time? 借助我們如今可以使用的更新&#xff0c;更…

CCNA課堂練習:OSPF的介紹及配置

CCNA淺談OSPF的配置 今天我們來談談路由器OSPF的配置&#xff0c;那我先來介紹一下OSPF的特點&#xff1a;1、對網絡發生的變化能夠快速響應2、當網絡發生變化的時候發送觸發式更新?3、支持VLAN 4、管理方便ospf引用了區域的概念&#xff0c;區域分兩種&#xff1a;1、骨干區域…

vcenter 6.7 (vcsa)部署指南

閑言少敘&#xff0c;直達心靈。 一、部署提要1.1 vCenter Server Appliance(VCSA )6.7下載地址https://pan.baidu.com/s/1WUShsC23E2qIIBg7MPR87w 6lzb 二、安裝部署VCSA分為兩個階段安裝&#xff0c;下面我們開始第一階段2.1 打開之后&#xff0c;直接點擊安裝按鈕2.2部署設備…

如何停止Internet Explorer 11的建議站點?

Internet Explorer automatically suggests addresses and search results based on the partial address you’re typing out. If this feature irritates you, read on as we learn how to turn it off. Internet Explorer會根據您鍵入的部分地址自動建議地址和搜索結果。 如…

什么是SG?+SG模板

先&#xff0c;定義一下 狀態Position P 先手必敗 N x先手必勝 操作方法&#xff1a; 反向轉移 相同狀態 不同位置 的一對 相當于無 對于ICG游戲&#xff0c;我們可以將游戲中每一個可能發生的局面表示為一個點。并且若存在局面i和局面j&#xff0c;且j是i的后繼局面(即局面i可…

【桌面虛擬化】之三 Persistent vs NonP

作者&#xff1a;范軍 &#xff08;Frank Fan&#xff09; 新浪微博&#xff1a;frankfan7 在【桌面虛擬化】之二類型及案例中我們探討了桌面虛擬化的兩種架構&#xff0c;HostedVirtual Desktop (VDI) 和 Published Desktop/App. 本文深入分析其中VDI的兩種桌面類型&#xff0…

H5 video 開發問題及相關知識點

相關鏈接&#xff1a;H5 video 的使用H5 video 全屏播放? video點播與直播H5 video目前所有瀏覽器都支持的視頻格式是MP4格式&#xff0c;所以mp4應當是點播web視頻的首選格式。而在直播視頻上&#xff0c;H5 video只在移動端原生支持HLS流的直播視頻(Mac safari video標簽也支…

Mybatis-Generator自動生成XML文件以及接口和實體類

整合了MySQL和Oracle配置文件生成方法 這個是整個文件夾的下載地址&#xff1a;http://www.codepeople.cn/download 主要給大家介紹一下generatorConfig.xml文件的配置&#xff0c;以及生成后的文件。 generatorConfig.xml <?xml version"1.0" encoding"UTF…